mirror of
https://github.com/Retropex/bitcoin.git
synced 2025-05-15 12:40:41 +02:00
Merge bitcoin/bitcoin#32438: refactor: Removals after bdb removal
fa061bfcdb
Remove create options from wallet tool (MarcoFalke)fa2125e7b8
Remove unused IsSingleKey (MarcoFalke)fab5e2a094
doc: Remove note about bdb wallets (MarcoFalke)eeeef88d46
doc: fix typo in abortrescan rpc (MarcoFalke)fa7e5c15a7
Remove unused LegacyDataSPKM::DeleteRecords() (MarcoFalke)ffff949472
remove NotifyWatchonlyChanged (MarcoFalke)fa62a013a5
remove dead flush() (MarcoFalke)fa5f3e62c8
vcpkg: Remove bdb (MarcoFalke) Pull request description: This deletes some dead code ACKs for top commit: Sjors: ACKfa061bfcdb
if CI is also happy rkrux: utACKfa061bf
Tree-SHA512: 6c0b0705caa4ad024e6b921bd7f65aaa055d1f12f7884cd61823cbf0c32e46697ddbdaa209ab449d6a1df9761ce5d53763e25f26e4c36ce4c685b7524f5a3dd9
This commit is contained in:
commit
9a05b45da6
@ -82,7 +82,7 @@ In the GUI, there is no specific menu item to unlock the wallet. When the user s
|
|||||||
|
|
||||||
To backup the wallet, the `backupwallet` RPC or the `Backup Wallet` GUI menu item must be used to ensure the file is in a safe state when the copy is made.
|
To backup the wallet, the `backupwallet` RPC or the `Backup Wallet` GUI menu item must be used to ensure the file is in a safe state when the copy is made.
|
||||||
|
|
||||||
In the RPC, the destination parameter must include the name of the file. Otherwise, the command will return an error message like "Error: Wallet backup failed!" for descriptor wallets. If it is a legacy wallet, it will be copied and a file will be created with the default file name `wallet.dat`.
|
In the RPC, the destination parameter must include the name of the file. Otherwise, the command will return an error message like "Error: Wallet backup failed!".
|
||||||
|
|
||||||
```
|
```
|
||||||
$ bitcoin-cli -rpcwallet="wallet-01" backupwallet /home/node01/Backups/backup-01.dat
|
$ bitcoin-cli -rpcwallet="wallet-01" backupwallet /home/node01/Backups/backup-01.dat
|
||||||
|
@ -38,12 +38,10 @@ static void SetupWalletToolArgs(ArgsManager& argsman)
|
|||||||
argsman.AddArg("-wallet=<wallet-name>", "Specify wallet name", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::OPTIONS);
|
argsman.AddArg("-wallet=<wallet-name>", "Specify wallet name", ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::OPTIONS);
|
||||||
argsman.AddArg("-dumpfile=<file name>", "When used with 'dump', writes out the records to this file. When used with 'createfromdump', loads the records into a new wallet.", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_NEGATION, OptionsCategory::OPTIONS);
|
argsman.AddArg("-dumpfile=<file name>", "When used with 'dump', writes out the records to this file. When used with 'createfromdump', loads the records into a new wallet.", ArgsManager::ALLOW_ANY | ArgsManager::DISALLOW_NEGATION, OptionsCategory::OPTIONS);
|
||||||
argsman.AddArg("-debug=<category>", "Output debugging information (default: 0).", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-debug=<category>", "Output debugging information (default: 0).", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-descriptors", "Create descriptors wallet. Only for 'create'", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
|
||||||
argsman.AddArg("-legacy", "Create legacy wallet. Only for 'create'", ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
|
||||||
argsman.AddArg("-printtoconsole", "Send trace/debug info to console (default: 1 when no -debug is true, 0 otherwise).", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-printtoconsole", "Send trace/debug info to console (default: 1 when no -debug is true, 0 otherwise).", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
|
|
||||||
argsman.AddCommand("info", "Get wallet info");
|
argsman.AddCommand("info", "Get wallet info");
|
||||||
argsman.AddCommand("create", "Create new wallet file");
|
argsman.AddCommand("create", "Create a new descriptor wallet file");
|
||||||
argsman.AddCommand("dump", "Print out all of the wallet key-value records");
|
argsman.AddCommand("dump", "Print out all of the wallet key-value records");
|
||||||
argsman.AddCommand("createfromdump", "Create new wallet file from dumped records");
|
argsman.AddCommand("createfromdump", "Create new wallet file from dumped records");
|
||||||
}
|
}
|
||||||
|
@ -298,9 +298,6 @@ void Shutdown(NodeContext& node)
|
|||||||
StopREST();
|
StopREST();
|
||||||
StopRPC();
|
StopRPC();
|
||||||
StopHTTPServer();
|
StopHTTPServer();
|
||||||
for (const auto& client : node.chain_clients) {
|
|
||||||
client->flush();
|
|
||||||
}
|
|
||||||
StopMapPort();
|
StopMapPort();
|
||||||
|
|
||||||
// Because these depend on each-other, we make sure that neither can be
|
// Because these depend on each-other, we make sure that neither can be
|
||||||
|
@ -407,9 +407,6 @@ public:
|
|||||||
//! Start client execution and provide a scheduler.
|
//! Start client execution and provide a scheduler.
|
||||||
virtual void start(CScheduler& scheduler) = 0;
|
virtual void start(CScheduler& scheduler) = 0;
|
||||||
|
|
||||||
//! Save state to disk.
|
|
||||||
virtual void flush() = 0;
|
|
||||||
|
|
||||||
//! Shut down client.
|
//! Shut down client.
|
||||||
virtual void stop() = 0;
|
virtual void stop() = 0;
|
||||||
|
|
||||||
|
@ -303,10 +303,6 @@ public:
|
|||||||
using TransactionChangedFn = std::function<void(const uint256& txid, ChangeType status)>;
|
using TransactionChangedFn = std::function<void(const uint256& txid, ChangeType status)>;
|
||||||
virtual std::unique_ptr<Handler> handleTransactionChanged(TransactionChangedFn fn) = 0;
|
virtual std::unique_ptr<Handler> handleTransactionChanged(TransactionChangedFn fn) = 0;
|
||||||
|
|
||||||
//! Register handler for watchonly changed messages.
|
|
||||||
using WatchOnlyChangedFn = std::function<void(bool have_watch_only)>;
|
|
||||||
virtual std::unique_ptr<Handler> handleWatchOnlyChanged(WatchOnlyChangedFn fn) = 0;
|
|
||||||
|
|
||||||
//! Register handler for keypool changed messages.
|
//! Register handler for keypool changed messages.
|
||||||
using CanGetAddressesChangedFn = std::function<void()>;
|
using CanGetAddressesChangedFn = std::function<void()>;
|
||||||
virtual std::unique_ptr<Handler> handleCanGetAddressesChanged(CanGetAddressesChangedFn fn) = 0;
|
virtual std::unique_ptr<Handler> handleCanGetAddressesChanged(CanGetAddressesChangedFn fn) = 0;
|
||||||
|
@ -243,9 +243,6 @@ void TransactionView::setModel(WalletModel *_model)
|
|||||||
|
|
||||||
// hide column Watch-only
|
// hide column Watch-only
|
||||||
updateWatchOnlyColumn(false);
|
updateWatchOnlyColumn(false);
|
||||||
|
|
||||||
// Watch-only signal
|
|
||||||
connect(_model, &WalletModel::notifyWatchonlyChanged, this, &TransactionView::updateWatchOnlyColumn);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +45,6 @@ WalletModel::WalletModel(std::unique_ptr<interfaces::Wallet> wallet, ClientModel
|
|||||||
optionsModel(client_model.getOptionsModel()),
|
optionsModel(client_model.getOptionsModel()),
|
||||||
timer(new QTimer(this))
|
timer(new QTimer(this))
|
||||||
{
|
{
|
||||||
fHaveWatchOnly = false;
|
|
||||||
addressTableModel = new AddressTableModel(this);
|
addressTableModel = new AddressTableModel(this);
|
||||||
transactionTableModel = new TransactionTableModel(platformStyle, this);
|
transactionTableModel = new TransactionTableModel(platformStyle, this);
|
||||||
recentRequestsTableModel = new RecentRequestsTableModel(this);
|
recentRequestsTableModel = new RecentRequestsTableModel(this);
|
||||||
@ -141,12 +140,6 @@ void WalletModel::updateAddressBook(const QString &address, const QString &label
|
|||||||
addressTableModel->updateEntry(address, label, isMine, purpose, status);
|
addressTableModel->updateEntry(address, label, isMine, purpose, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WalletModel::updateWatchOnlyFlag(bool fHaveWatchonly)
|
|
||||||
{
|
|
||||||
fHaveWatchOnly = fHaveWatchonly;
|
|
||||||
Q_EMIT notifyWatchonlyChanged(fHaveWatchonly);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WalletModel::validateAddress(const QString& address) const
|
bool WalletModel::validateAddress(const QString& address) const
|
||||||
{
|
{
|
||||||
return IsValidDestinationString(address.toStdString());
|
return IsValidDestinationString(address.toStdString());
|
||||||
@ -405,13 +398,6 @@ static void ShowProgress(WalletModel *walletmodel, const std::string &title, int
|
|||||||
assert(invoked);
|
assert(invoked);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NotifyWatchonlyChanged(WalletModel *walletmodel, bool fHaveWatchonly)
|
|
||||||
{
|
|
||||||
bool invoked = QMetaObject::invokeMethod(walletmodel, "updateWatchOnlyFlag", Qt::QueuedConnection,
|
|
||||||
Q_ARG(bool, fHaveWatchonly));
|
|
||||||
assert(invoked);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void NotifyCanGetAddressesChanged(WalletModel* walletmodel)
|
static void NotifyCanGetAddressesChanged(WalletModel* walletmodel)
|
||||||
{
|
{
|
||||||
bool invoked = QMetaObject::invokeMethod(walletmodel, "canGetAddressesChanged");
|
bool invoked = QMetaObject::invokeMethod(walletmodel, "canGetAddressesChanged");
|
||||||
@ -426,7 +412,6 @@ void WalletModel::subscribeToCoreSignals()
|
|||||||
m_handler_address_book_changed = m_wallet->handleAddressBookChanged(std::bind(NotifyAddressBookChanged, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
|
m_handler_address_book_changed = m_wallet->handleAddressBookChanged(std::bind(NotifyAddressBookChanged, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
|
||||||
m_handler_transaction_changed = m_wallet->handleTransactionChanged(std::bind(NotifyTransactionChanged, this, std::placeholders::_1, std::placeholders::_2));
|
m_handler_transaction_changed = m_wallet->handleTransactionChanged(std::bind(NotifyTransactionChanged, this, std::placeholders::_1, std::placeholders::_2));
|
||||||
m_handler_show_progress = m_wallet->handleShowProgress(std::bind(ShowProgress, this, std::placeholders::_1, std::placeholders::_2));
|
m_handler_show_progress = m_wallet->handleShowProgress(std::bind(ShowProgress, this, std::placeholders::_1, std::placeholders::_2));
|
||||||
m_handler_watch_only_changed = m_wallet->handleWatchOnlyChanged(std::bind(NotifyWatchonlyChanged, this, std::placeholders::_1));
|
|
||||||
m_handler_can_get_addrs_changed = m_wallet->handleCanGetAddressesChanged(std::bind(NotifyCanGetAddressesChanged, this));
|
m_handler_can_get_addrs_changed = m_wallet->handleCanGetAddressesChanged(std::bind(NotifyCanGetAddressesChanged, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -438,7 +423,6 @@ void WalletModel::unsubscribeFromCoreSignals()
|
|||||||
m_handler_address_book_changed->disconnect();
|
m_handler_address_book_changed->disconnect();
|
||||||
m_handler_transaction_changed->disconnect();
|
m_handler_transaction_changed->disconnect();
|
||||||
m_handler_show_progress->disconnect();
|
m_handler_show_progress->disconnect();
|
||||||
m_handler_watch_only_changed->disconnect();
|
|
||||||
m_handler_can_get_addrs_changed->disconnect();
|
m_handler_can_get_addrs_changed->disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,12 +162,10 @@ private:
|
|||||||
std::unique_ptr<interfaces::Handler> m_handler_address_book_changed;
|
std::unique_ptr<interfaces::Handler> m_handler_address_book_changed;
|
||||||
std::unique_ptr<interfaces::Handler> m_handler_transaction_changed;
|
std::unique_ptr<interfaces::Handler> m_handler_transaction_changed;
|
||||||
std::unique_ptr<interfaces::Handler> m_handler_show_progress;
|
std::unique_ptr<interfaces::Handler> m_handler_show_progress;
|
||||||
std::unique_ptr<interfaces::Handler> m_handler_watch_only_changed;
|
|
||||||
std::unique_ptr<interfaces::Handler> m_handler_can_get_addrs_changed;
|
std::unique_ptr<interfaces::Handler> m_handler_can_get_addrs_changed;
|
||||||
ClientModel* m_client_model;
|
ClientModel* m_client_model;
|
||||||
interfaces::Node& m_node;
|
interfaces::Node& m_node;
|
||||||
|
|
||||||
bool fHaveWatchOnly;
|
|
||||||
bool fForceCheckBalanceChanged{false};
|
bool fForceCheckBalanceChanged{false};
|
||||||
|
|
||||||
// Wallet has an options model for wallet-specific options
|
// Wallet has an options model for wallet-specific options
|
||||||
@ -211,9 +209,6 @@ Q_SIGNALS:
|
|||||||
// Show progress dialog e.g. for rescan
|
// Show progress dialog e.g. for rescan
|
||||||
void showProgress(const QString &title, int nProgress);
|
void showProgress(const QString &title, int nProgress);
|
||||||
|
|
||||||
// Watch-only address added
|
|
||||||
void notifyWatchonlyChanged(bool fHaveWatchonly);
|
|
||||||
|
|
||||||
// Signal that wallet is about to be removed
|
// Signal that wallet is about to be removed
|
||||||
void unload();
|
void unload();
|
||||||
|
|
||||||
@ -232,8 +227,6 @@ public Q_SLOTS:
|
|||||||
void updateTransaction();
|
void updateTransaction();
|
||||||
/* New, updated or removed address book entry */
|
/* New, updated or removed address book entry */
|
||||||
void updateAddressBook(const QString &address, const QString &label, bool isMine, wallet::AddressPurpose purpose, int status);
|
void updateAddressBook(const QString &address, const QString &label, bool isMine, wallet::AddressPurpose purpose, int status);
|
||||||
/* Watch-only added */
|
|
||||||
void updateWatchOnlyFlag(bool fHaveWatchonly);
|
|
||||||
/* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */
|
/* Current, immature or unconfirmed balance might have changed - emit 'balanceChanged' if so */
|
||||||
void pollBalanceChanged();
|
void pollBalanceChanged();
|
||||||
};
|
};
|
||||||
|
@ -799,7 +799,6 @@ public:
|
|||||||
return OutputTypeFromDestination(m_destination);
|
return OutputTypeFromDestination(m_destination);
|
||||||
}
|
}
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return false; }
|
|
||||||
bool ToPrivateString(const SigningProvider& arg, std::string& out) const final { return false; }
|
bool ToPrivateString(const SigningProvider& arg, std::string& out) const final { return false; }
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override { return GetScriptForDestination(m_destination).size(); }
|
std::optional<int64_t> ScriptSize() const override { return GetScriptForDestination(m_destination).size(); }
|
||||||
@ -827,7 +826,6 @@ public:
|
|||||||
return OutputTypeFromDestination(dest);
|
return OutputTypeFromDestination(dest);
|
||||||
}
|
}
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return false; }
|
|
||||||
bool ToPrivateString(const SigningProvider& arg, std::string& out) const final { return false; }
|
bool ToPrivateString(const SigningProvider& arg, std::string& out) const final { return false; }
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override { return m_script.size(); }
|
std::optional<int64_t> ScriptSize() const override { return m_script.size(); }
|
||||||
@ -856,7 +854,6 @@ protected:
|
|||||||
public:
|
public:
|
||||||
PKDescriptor(std::unique_ptr<PubkeyProvider> prov, bool xonly = false) : DescriptorImpl(Vector(std::move(prov)), "pk"), m_xonly(xonly) {}
|
PKDescriptor(std::unique_ptr<PubkeyProvider> prov, bool xonly = false) : DescriptorImpl(Vector(std::move(prov)), "pk"), m_xonly(xonly) {}
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return true; }
|
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override {
|
std::optional<int64_t> ScriptSize() const override {
|
||||||
return 1 + (m_xonly ? 32 : m_pubkey_args[0]->GetSize()) + 1;
|
return 1 + (m_xonly ? 32 : m_pubkey_args[0]->GetSize()) + 1;
|
||||||
@ -892,7 +889,6 @@ public:
|
|||||||
PKHDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Vector(std::move(prov)), "pkh") {}
|
PKHDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Vector(std::move(prov)), "pkh") {}
|
||||||
std::optional<OutputType> GetOutputType() const override { return OutputType::LEGACY; }
|
std::optional<OutputType> GetOutputType() const override { return OutputType::LEGACY; }
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return true; }
|
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 1 + 20 + 1 + 1; }
|
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 1 + 20 + 1 + 1; }
|
||||||
|
|
||||||
@ -926,7 +922,6 @@ public:
|
|||||||
WPKHDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Vector(std::move(prov)), "wpkh") {}
|
WPKHDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Vector(std::move(prov)), "wpkh") {}
|
||||||
std::optional<OutputType> GetOutputType() const override { return OutputType::BECH32; }
|
std::optional<OutputType> GetOutputType() const override { return OutputType::BECH32; }
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return true; }
|
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 20; }
|
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 20; }
|
||||||
|
|
||||||
@ -968,7 +963,6 @@ protected:
|
|||||||
public:
|
public:
|
||||||
ComboDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Vector(std::move(prov)), "combo") {}
|
ComboDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Vector(std::move(prov)), "combo") {}
|
||||||
bool IsSingleType() const final { return false; }
|
bool IsSingleType() const final { return false; }
|
||||||
bool IsSingleKey() const final { return true; }
|
|
||||||
std::unique_ptr<DescriptorImpl> Clone() const override
|
std::unique_ptr<DescriptorImpl> Clone() const override
|
||||||
{
|
{
|
||||||
return std::make_unique<ComboDescriptor>(m_pubkey_args.at(0)->Clone());
|
return std::make_unique<ComboDescriptor>(m_pubkey_args.at(0)->Clone());
|
||||||
@ -993,7 +987,6 @@ protected:
|
|||||||
public:
|
public:
|
||||||
MultisigDescriptor(int threshold, std::vector<std::unique_ptr<PubkeyProvider>> providers, bool sorted = false) : DescriptorImpl(std::move(providers), sorted ? "sortedmulti" : "multi"), m_threshold(threshold), m_sorted(sorted) {}
|
MultisigDescriptor(int threshold, std::vector<std::unique_ptr<PubkeyProvider>> providers, bool sorted = false) : DescriptorImpl(std::move(providers), sorted ? "sortedmulti" : "multi"), m_threshold(threshold), m_sorted(sorted) {}
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return false; }
|
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override {
|
std::optional<int64_t> ScriptSize() const override {
|
||||||
const auto n_keys = m_pubkey_args.size();
|
const auto n_keys = m_pubkey_args.size();
|
||||||
@ -1045,7 +1038,6 @@ protected:
|
|||||||
public:
|
public:
|
||||||
MultiADescriptor(int threshold, std::vector<std::unique_ptr<PubkeyProvider>> providers, bool sorted = false) : DescriptorImpl(std::move(providers), sorted ? "sortedmulti_a" : "multi_a"), m_threshold(threshold), m_sorted(sorted) {}
|
MultiADescriptor(int threshold, std::vector<std::unique_ptr<PubkeyProvider>> providers, bool sorted = false) : DescriptorImpl(std::move(providers), sorted ? "sortedmulti_a" : "multi_a"), m_threshold(threshold), m_sorted(sorted) {}
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return false; }
|
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override {
|
std::optional<int64_t> ScriptSize() const override {
|
||||||
const auto n_keys = m_pubkey_args.size();
|
const auto n_keys = m_pubkey_args.size();
|
||||||
@ -1092,7 +1084,6 @@ public:
|
|||||||
return OutputType::LEGACY;
|
return OutputType::LEGACY;
|
||||||
}
|
}
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return m_subdescriptor_args[0]->IsSingleKey(); }
|
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 20 + 1; }
|
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 20 + 1; }
|
||||||
|
|
||||||
@ -1134,7 +1125,6 @@ public:
|
|||||||
WSHDescriptor(std::unique_ptr<DescriptorImpl> desc) : DescriptorImpl({}, std::move(desc), "wsh") {}
|
WSHDescriptor(std::unique_ptr<DescriptorImpl> desc) : DescriptorImpl({}, std::move(desc), "wsh") {}
|
||||||
std::optional<OutputType> GetOutputType() const override { return OutputType::BECH32; }
|
std::optional<OutputType> GetOutputType() const override { return OutputType::BECH32; }
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return m_subdescriptor_args[0]->IsSingleKey(); }
|
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 32; }
|
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 32; }
|
||||||
|
|
||||||
@ -1212,7 +1202,6 @@ public:
|
|||||||
}
|
}
|
||||||
std::optional<OutputType> GetOutputType() const override { return OutputType::BECH32M; }
|
std::optional<OutputType> GetOutputType() const override { return OutputType::BECH32M; }
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return false; }
|
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 32; }
|
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 32; }
|
||||||
|
|
||||||
@ -1340,7 +1329,6 @@ public:
|
|||||||
|
|
||||||
bool IsSolvable() const override { return true; }
|
bool IsSolvable() const override { return true; }
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return false; }
|
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override { return m_node->ScriptSize(); }
|
std::optional<int64_t> ScriptSize() const override { return m_node->ScriptSize(); }
|
||||||
|
|
||||||
@ -1380,7 +1368,6 @@ public:
|
|||||||
RawTRDescriptor(std::unique_ptr<PubkeyProvider> output_key) : DescriptorImpl(Vector(std::move(output_key)), "rawtr") {}
|
RawTRDescriptor(std::unique_ptr<PubkeyProvider> output_key) : DescriptorImpl(Vector(std::move(output_key)), "rawtr") {}
|
||||||
std::optional<OutputType> GetOutputType() const override { return OutputType::BECH32M; }
|
std::optional<OutputType> GetOutputType() const override { return OutputType::BECH32M; }
|
||||||
bool IsSingleType() const final { return true; }
|
bool IsSingleType() const final { return true; }
|
||||||
bool IsSingleKey() const final { return false; }
|
|
||||||
|
|
||||||
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 32; }
|
std::optional<int64_t> ScriptSize() const override { return 1 + 1 + 32; }
|
||||||
|
|
||||||
|
@ -111,11 +111,6 @@ struct Descriptor {
|
|||||||
/** Whether this descriptor will return one scriptPubKey or multiple (aka is or is not combo) */
|
/** Whether this descriptor will return one scriptPubKey or multiple (aka is or is not combo) */
|
||||||
virtual bool IsSingleType() const = 0;
|
virtual bool IsSingleType() const = 0;
|
||||||
|
|
||||||
/** Whether this descriptor only produces single key scripts (i.e. pk(), pkh(), wpkh(), sh() and wsh() nested of those, and combo())
|
|
||||||
* TODO: Remove this method once legacy wallets are removed as it is only necessary for importmulti.
|
|
||||||
*/
|
|
||||||
virtual bool IsSingleKey() const = 0;
|
|
||||||
|
|
||||||
/** Convert the descriptor to a private string. This fails if the provided provider does not have the relevant private keys. */
|
/** Convert the descriptor to a private string. This fails if the provided provider does not have the relevant private keys. */
|
||||||
virtual bool ToPrivateString(const SigningProvider& provider, std::string& out) const = 0;
|
virtual bool ToPrivateString(const SigningProvider& provider, std::string& out) const = 0;
|
||||||
|
|
||||||
|
@ -535,10 +535,6 @@ public:
|
|||||||
return MakeSignalHandler(m_wallet->NotifyTransactionChanged.connect(
|
return MakeSignalHandler(m_wallet->NotifyTransactionChanged.connect(
|
||||||
[fn](const uint256& txid, ChangeType status) { fn(txid, status); }));
|
[fn](const uint256& txid, ChangeType status) { fn(txid, status); }));
|
||||||
}
|
}
|
||||||
std::unique_ptr<Handler> handleWatchOnlyChanged(WatchOnlyChangedFn fn) override
|
|
||||||
{
|
|
||||||
return MakeSignalHandler(m_wallet->NotifyWatchonlyChanged.connect(fn));
|
|
||||||
}
|
|
||||||
std::unique_ptr<Handler> handleCanGetAddressesChanged(CanGetAddressesChangedFn fn) override
|
std::unique_ptr<Handler> handleCanGetAddressesChanged(CanGetAddressesChangedFn fn) override
|
||||||
{
|
{
|
||||||
return MakeSignalHandler(m_wallet->NotifyCanGetAddressesChanged.connect(fn));
|
return MakeSignalHandler(m_wallet->NotifyCanGetAddressesChanged.connect(fn));
|
||||||
@ -578,7 +574,6 @@ public:
|
|||||||
m_context.scheduler = &scheduler;
|
m_context.scheduler = &scheduler;
|
||||||
return StartWallets(m_context);
|
return StartWallets(m_context);
|
||||||
}
|
}
|
||||||
void flush() override {}
|
|
||||||
void stop() override { return StopWallets(m_context); }
|
void stop() override { return StopWallets(m_context); }
|
||||||
void setMockTime(int64_t time) override { return SetMockTime(time); }
|
void setMockTime(int64_t time) override { return SetMockTime(time); }
|
||||||
void schedulerMockForward(std::chrono::seconds delta) override { Assert(m_context.scheduler)->MockForward(delta); }
|
void schedulerMockForward(std::chrono::seconds delta) override { Assert(m_context.scheduler)->MockForward(delta); }
|
||||||
|
@ -946,7 +946,7 @@ RPCHelpMan rescanblockchain()
|
|||||||
RPCHelpMan abortrescan()
|
RPCHelpMan abortrescan()
|
||||||
{
|
{
|
||||||
return RPCHelpMan{"abortrescan",
|
return RPCHelpMan{"abortrescan",
|
||||||
"\nStops current wallet rescan triggered by an RPC call, e.g. by an rescanblockchain call.\n"
|
"Stops current wallet rescan triggered by an RPC call, e.g. by a rescanblockchain call.\n"
|
||||||
"Note: Use \"getwalletinfo\" to query the scanning progress.\n",
|
"Note: Use \"getwalletinfo\" to query the scanning progress.\n",
|
||||||
{},
|
{},
|
||||||
RPCResult{RPCResult::Type::BOOL, "", "Whether the abort was successful"},
|
RPCResult{RPCResult::Type::BOOL, "", "Whether the abort was successful"},
|
||||||
|
@ -820,13 +820,6 @@ std::optional<MigrationData> LegacyDataSPKM::MigrateToDescriptor()
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LegacyDataSPKM::DeleteRecords()
|
|
||||||
{
|
|
||||||
return RunWithinTxn(m_storage.GetDatabase(), /*process_desc=*/"delete legacy records", [&](WalletBatch& batch){
|
|
||||||
return DeleteRecordsWithDB(batch);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LegacyDataSPKM::DeleteRecordsWithDB(WalletBatch& batch)
|
bool LegacyDataSPKM::DeleteRecordsWithDB(WalletBatch& batch)
|
||||||
{
|
{
|
||||||
LOCK(cs_KeyStore);
|
LOCK(cs_KeyStore);
|
||||||
|
@ -167,9 +167,6 @@ public:
|
|||||||
LogInfo("%s %s", m_storage.GetDisplayName(), tfm::format(wallet_fmt, params...));
|
LogInfo("%s %s", m_storage.GetDisplayName(), tfm::format(wallet_fmt, params...));
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Watch-only address added */
|
|
||||||
boost::signals2::signal<void (bool fHaveWatchOnly)> NotifyWatchonlyChanged;
|
|
||||||
|
|
||||||
/** Keypool has new keys */
|
/** Keypool has new keys */
|
||||||
boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
|
boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
|
||||||
|
|
||||||
@ -270,7 +267,6 @@ public:
|
|||||||
* Does not modify this ScriptPubKeyMan. */
|
* Does not modify this ScriptPubKeyMan. */
|
||||||
std::optional<MigrationData> MigrateToDescriptor();
|
std::optional<MigrationData> MigrateToDescriptor();
|
||||||
/** Delete all the records of this LegacyScriptPubKeyMan from disk*/
|
/** Delete all the records of this LegacyScriptPubKeyMan from disk*/
|
||||||
bool DeleteRecords();
|
|
||||||
bool DeleteRecordsWithDB(WalletBatch& batch);
|
bool DeleteRecordsWithDB(WalletBatch& batch);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,7 +26,6 @@ public:
|
|||||||
bool IsRange() const override { return false; }
|
bool IsRange() const override { return false; }
|
||||||
bool IsSolvable() const override { return false; }
|
bool IsSolvable() const override { return false; }
|
||||||
bool IsSingleType() const override { return true; }
|
bool IsSingleType() const override { return true; }
|
||||||
bool IsSingleKey() const override { return true; }
|
|
||||||
bool ToPrivateString(const SigningProvider& provider, std::string& out) const override { return false; }
|
bool ToPrivateString(const SigningProvider& provider, std::string& out) const override { return false; }
|
||||||
bool ToNormalizedString(const SigningProvider& provider, std::string& out, const DescriptorCache* cache = nullptr) const override { return false; }
|
bool ToNormalizedString(const SigningProvider& provider, std::string& out, const DescriptorCache* cache = nullptr) const override { return false; }
|
||||||
bool Expand(int pos, const SigningProvider& provider, std::vector<CScript>& output_scripts, FlatSigningProvider& out, DescriptorCache* write_cache = nullptr) const override { return false; };
|
bool Expand(int pos, const SigningProvider& provider, std::vector<CScript>& output_scripts, FlatSigningProvider& out, DescriptorCache* write_cache = nullptr) const override { return false; };
|
||||||
|
@ -3518,7 +3518,6 @@ bool CWallet::HaveCryptedKeys() const
|
|||||||
void CWallet::ConnectScriptPubKeyManNotifiers()
|
void CWallet::ConnectScriptPubKeyManNotifiers()
|
||||||
{
|
{
|
||||||
for (const auto& spk_man : GetActiveScriptPubKeyMans()) {
|
for (const auto& spk_man : GetActiveScriptPubKeyMans()) {
|
||||||
spk_man->NotifyWatchonlyChanged.connect(NotifyWatchonlyChanged);
|
|
||||||
spk_man->NotifyCanGetAddressesChanged.connect(NotifyCanGetAddressesChanged);
|
spk_man->NotifyCanGetAddressesChanged.connect(NotifyCanGetAddressesChanged);
|
||||||
spk_man->NotifyFirstKeyTimeChanged.connect(std::bind(&CWallet::MaybeUpdateBirthTime, this, std::placeholders::_2));
|
spk_man->NotifyFirstKeyTimeChanged.connect(std::bind(&CWallet::MaybeUpdateBirthTime, this, std::placeholders::_2));
|
||||||
}
|
}
|
||||||
|
@ -842,9 +842,6 @@ public:
|
|||||||
/** Show progress e.g. for rescan */
|
/** Show progress e.g. for rescan */
|
||||||
boost::signals2::signal<void (const std::string &title, int nProgress)> ShowProgress;
|
boost::signals2::signal<void (const std::string &title, int nProgress)> ShowProgress;
|
||||||
|
|
||||||
/** Watch-only address added */
|
|
||||||
boost::signals2::signal<void (bool fHaveWatchOnly)> NotifyWatchonlyChanged;
|
|
||||||
|
|
||||||
/** Keypool has new keys */
|
/** Keypool has new keys */
|
||||||
boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
|
boost::signals2::signal<void ()> NotifyCanGetAddressesChanged;
|
||||||
|
|
||||||
|
@ -112,26 +112,6 @@ bool ExecuteWalletToolFunc(const ArgsManager& args, const std::string& command)
|
|||||||
tfm::format(std::cerr, "The -dumpfile option can only be used with the \"dump\" and \"createfromdump\" commands.\n");
|
tfm::format(std::cerr, "The -dumpfile option can only be used with the \"dump\" and \"createfromdump\" commands.\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (args.IsArgSet("-descriptors")) {
|
|
||||||
if (command != "create") {
|
|
||||||
tfm::format(std::cerr, "The -descriptors option can only be used with the 'create' command.\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!args.GetBoolArg("-descriptors", true)) {
|
|
||||||
tfm::format(std::cerr, "The -descriptors option must be set to \"true\"\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (args.IsArgSet("-legacy")) {
|
|
||||||
if (command != "create") {
|
|
||||||
tfm::format(std::cerr, "The -legacy option can only be used with the 'create' command.\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (args.GetBoolArg("-legacy", true)) {
|
|
||||||
tfm::format(std::cerr, "The -legacy option must be set to \"false\"\n");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (command == "create" && !args.IsArgSet("-wallet")) {
|
if (command == "create" && !args.IsArgSet("-wallet")) {
|
||||||
tfm::format(std::cerr, "Wallet name must be provided when creating a new wallet.\n");
|
tfm::format(std::cerr, "Wallet name must be provided when creating a new wallet.\n");
|
||||||
return false;
|
return false;
|
||||||
|
@ -274,7 +274,7 @@ class ToolWalletTest(BitcoinTestFramework):
|
|||||||
self.assert_raises_tool_error('Dump file {} does not exist.'.format(non_exist_dump), '-wallet=todump', '-dumpfile={}'.format(non_exist_dump), 'createfromdump')
|
self.assert_raises_tool_error('Dump file {} does not exist.'.format(non_exist_dump), '-wallet=todump', '-dumpfile={}'.format(non_exist_dump), 'createfromdump')
|
||||||
wallet_path = self.nodes[0].wallets_path / "todump2"
|
wallet_path = self.nodes[0].wallets_path / "todump2"
|
||||||
self.assert_raises_tool_error('Failed to create database path \'{}\'. Database already exists.'.format(wallet_path), '-wallet=todump2', '-dumpfile={}'.format(wallet_dump), 'createfromdump')
|
self.assert_raises_tool_error('Failed to create database path \'{}\'. Database already exists.'.format(wallet_path), '-wallet=todump2', '-dumpfile={}'.format(wallet_dump), 'createfromdump')
|
||||||
self.assert_raises_tool_error("The -descriptors option can only be used with the 'create' command.", '-descriptors', '-wallet=todump2', '-dumpfile={}'.format(wallet_dump), 'createfromdump')
|
self.assert_raises_tool_error("Invalid parameter -descriptors", '-descriptors', '-wallet=todump2', '-dumpfile={}'.format(wallet_dump), 'createfromdump')
|
||||||
|
|
||||||
self.log.info('Checking createfromdump')
|
self.log.info('Checking createfromdump')
|
||||||
self.do_tool_createfromdump("load", "wallet.dump")
|
self.do_tool_createfromdump("load", "wallet.dump")
|
||||||
@ -416,9 +416,9 @@ class ToolWalletTest(BitcoinTestFramework):
|
|||||||
def test_no_create_legacy(self):
|
def test_no_create_legacy(self):
|
||||||
self.log.info("Test that legacy wallets cannot be created")
|
self.log.info("Test that legacy wallets cannot be created")
|
||||||
|
|
||||||
self.assert_raises_tool_error("The -legacy option must be set to \"false\"", "-wallet=legacy", "-legacy", "create")
|
self.assert_raises_tool_error("Invalid parameter -legacy", "-wallet=legacy", "-legacy", "create")
|
||||||
assert not (self.nodes[0].wallets_path / "legacy").exists()
|
assert not (self.nodes[0].wallets_path / "legacy").exists()
|
||||||
self.assert_raises_tool_error("The -descriptors option must be set to \"true\"", "-wallet=legacy", "-descriptors=false", "create")
|
self.assert_raises_tool_error("Invalid parameter -descriptors", "-wallet=legacy", "-descriptors=false", "create")
|
||||||
assert not (self.nodes[0].wallets_path / "legacy").exists()
|
assert not (self.nodes[0].wallets_path / "legacy").exists()
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
@ -11,16 +11,9 @@
|
|||||||
"qt",
|
"qt",
|
||||||
"tests",
|
"tests",
|
||||||
"wallet",
|
"wallet",
|
||||||
"berkeleydb",
|
|
||||||
"zeromq"
|
"zeromq"
|
||||||
],
|
],
|
||||||
"features": {
|
"features": {
|
||||||
"berkeleydb": {
|
|
||||||
"description": "Enable Berkeley DB wallet support",
|
|
||||||
"dependencies": [
|
|
||||||
"berkeleydb"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"qt": {
|
"qt": {
|
||||||
"description": "Build GUI, Qt 6",
|
"description": "Build GUI, Qt 6",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
|
Loading…
Reference in New Issue
Block a user