6 #include <bitcoin-build-config.h> 29 "You need to rescan the blockchain in order to correctly mark used " 30 "destinations in the past. Until this is done, some destinations may " 31 "be considered unused, even if the opposite is the case."},
45 "Returns an object containing various wallet state info.\n",
59 {
RPCResult::Type::NUM,
"keypoolsize",
"how many new keys are pre-generated (only counts external keys)"},
60 {
RPCResult::Type::NUM,
"keypoolsize_hd_internal",
true,
"how many new keys are pre-generated for internal use (used for change outputs, only appears if the wallet is using this feature, otherwise external keys are used)"},
61 {
RPCResult::Type::NUM_TIME,
"unlocked_until",
true,
"the " +
UNIX_EPOCH_TIME +
" until which the wallet is unlocked for transfers, or 0 if the wallet is locked (only present for passphrase-encrypted wallets)"},
64 {
RPCResult::Type::BOOL,
"private_keys_enabled",
"false if privatekeys are disabled for this wallet (enforced watch-only wallet)"},
65 {
RPCResult::Type::BOOL,
"avoid_reuse",
"whether this wallet tracks clean/dirty coins in terms of reuse"},
66 {
RPCResult::Type::OBJ,
"scanning",
"current scanning details, or false if no scan is in progress",
71 {
RPCResult::Type::BOOL,
"descriptors",
"whether this wallet uses descriptors for output script management"},
72 {
RPCResult::Type::BOOL,
"external_signer",
"whether this wallet is configured to use an external signer such as a hardware wallet"},
73 {
RPCResult::Type::BOOL,
"blank",
"Whether this wallet intentionally does not contain any keys, scripts, or descriptors"},
74 {
RPCResult::Type::NUM_TIME,
"birthtime",
true,
"The start time for blocks scanning. It could be modified by (re)importing any descriptor with an earlier timestamp."},
89 pwallet->BlockUntilSyncedToCurrentChain();
91 LOCK(pwallet->cs_wallet);
95 size_t kpExternalSize = pwallet->KeypoolCountExternalKeys();
97 obj.
pushKV(
"walletname", pwallet->GetName());
98 obj.
pushKV(
"walletversion", pwallet->GetVersion());
99 obj.
pushKV(
"format", pwallet->GetDatabase().Format());
103 obj.
pushKV(
"txcount", (
int)pwallet->mapWallet.size());
104 const auto kp_oldest = pwallet->GetOldestKeyPoolTime();
105 if (kp_oldest.has_value()) {
106 obj.
pushKV(
"keypoololdest", kp_oldest.value());
108 obj.
pushKV(
"keypoolsize", (int64_t)kpExternalSize);
119 obj.
pushKV(
"keypoolsize_hd_internal", (int64_t)(pwallet->GetKeyPoolSize() - kpExternalSize));
121 if (pwallet->IsCrypted()) {
122 obj.
pushKV(
"unlocked_until", pwallet->nRelockTime);
127 if (pwallet->IsScanning()) {
129 scanning.
pushKV(
"duration", Ticks<std::chrono::seconds>(pwallet->ScanningDuration()));
130 scanning.
pushKV(
"progress", pwallet->ScanningProgress());
131 obj.
pushKV(
"scanning", std::move(scanning));
133 obj.
pushKV(
"scanning",
false);
138 if (int64_t birthtime = pwallet->GetBirthTime(); birthtime !=
UNKNOWN_TIME) {
139 obj.
pushKV(
"birthtime", birthtime);
151 "Returns a list of wallets in the wallet directory.\n",
174 wallet.pushKV(
"name", path.utf8string());
179 result.pushKV(
"wallets", std::move(wallets));
188 "Returns a list of currently loaded wallets.\n" 189 "For full information on the wallet, use \"getwalletinfo\"\n",
219 "\nLoads a wallet from a wallet file or directory." 220 "\nNote that all wallet command-line options used when starting bitcoind will be" 221 "\napplied to the new wallet.\n",
223 {
"filename",
RPCArg::Type::STR,
RPCArg::Optional::NO,
"The path to the directory of the wallet to be loaded, either absolute or relative to the \"wallets\" directory. The \"wallets\" directory is set by the -walletdir option and defaults to the \"wallets\" folder within the data directory."},
230 {
RPCResult::Type::ARR,
"warnings",
true,
"Warning messages, if any, related to loading the wallet.",
237 "\nLoad wallet from the wallet dir:\n" 240 +
"\nLoad wallet using absolute path (Unix):\n" 243 +
"\nLoad wallet using absolute path (Windows):\n" 244 +
HelpExampleCli(
"loadwallet",
"\"DriveLetter:\\path\\to\\walletname\\\"")
245 +
HelpExampleRpc(
"loadwallet",
"\"DriveLetter:\\path\\to\\walletname\\\"")
250 const std::string
name(request.params[0].get_str());
255 options.require_existing =
true;
257 std::vector<bilingual_str> warnings;
258 std::optional<bool> load_on_start = request.params[1].isNull() ? std::nullopt : std::optional<bool>(request.params[1].get_bool());
262 if (std::any_of(context.wallets.begin(), context.wallets.end(), [&
name](
const auto&
wallet) {
return wallet->GetName() ==
name; })) {
267 std::shared_ptr<CWallet>
const wallet =
LoadWallet(context,
name, load_on_start, options, status, error, warnings);
285 flags += (
flags ==
"" ?
"" :
", ") + it.first;
288 "\nChange the state of the given wallet flag for a wallet.\n",
310 std::string flag_str = request.params[0].get_str();
311 bool value = request.params[1].isNull() || request.params[1].get_bool();
325 if (pwallet->IsWalletFlagSet(flag) == value) {
329 res.pushKV(
"flag_name", flag_str);
330 res.pushKV(
"flag_state", value);
333 pwallet->SetWalletFlag(flag);
335 pwallet->UnsetWalletFlag(flag);
351 "\nCreates and loads a new wallet.\n",
357 {
"avoid_reuse",
RPCArg::Type::BOOL,
RPCArg::Default{
false},
"Keep track of coin reuse, and treat dirty and clean coins differently with privacy considerations in mind."},
358 {
"descriptors",
RPCArg::Type::BOOL,
RPCArg::Default{
true},
"Create a native descriptor wallet. The wallet will use descriptors internally to handle address creation." 359 " Setting to \"false\" will create a legacy wallet; This is only possible with the -deprecatedrpc=create_bdb setting because, the legacy wallet type is being deprecated and" 360 " support for creating and opening legacy wallets will be removed in the future."},
362 {
"external_signer",
RPCArg::Type::BOOL,
RPCArg::Default{
false},
"Use an external signer such as a hardware wallet. Requires -signer to be configured. Wallet creation will fail if keys cannot be fetched. Requires disable_private_keys and descriptors set to true."},
367 {
RPCResult::Type::STR,
"name",
"The wallet name if created successfully. If the wallet was created using a full path, the wallet_name will be the full path."},
368 {
RPCResult::Type::ARR,
"warnings",
true,
"Warning messages, if any, related to creating and loading the wallet.",
377 +
HelpExampleCliNamed(
"createwallet", {{
"wallet_name",
"descriptors"}, {
"avoid_reuse",
true}, {
"descriptors",
true}, {
"load_on_startup",
true}})
378 +
HelpExampleRpcNamed(
"createwallet", {{
"wallet_name",
"descriptors"}, {
"avoid_reuse",
true}, {
"descriptors",
true}, {
"load_on_startup",
true}})
384 if (!request.params[1].isNull() && request.params[1].get_bool()) {
388 if (!request.params[2].isNull() && request.params[2].get_bool()) {
392 passphrase.reserve(100);
393 std::vector<bilingual_str> warnings;
394 if (!request.params[3].isNull()) {
395 passphrase = std::string_view{request.params[3].get_str()};
396 if (passphrase.empty()) {
398 warnings.emplace_back(
Untranslated(
"Empty string given as passphrase, wallet will not be encrypted."));
402 if (!request.params[4].isNull() && request.params[4].get_bool()) {
405 if (
self.Arg<bool>(
"descriptors")) {
413 " In this release it can be re-enabled temporarily with the -deprecatedrpc=create_bdb setting.");
416 if (!request.params[7].isNull() && request.params[7].get_bool()) {
417 #ifdef ENABLE_EXTERNAL_SIGNER 437 std::optional<bool> load_on_start = request.params[6].isNull() ? std::nullopt : std::optional<bool>(request.params[6].get_bool());
438 const std::shared_ptr<CWallet>
wallet =
CreateWallet(context, request.params[0].get_str(), load_on_start, options, status, error, warnings);
456 "Unloads the wallet referenced by the request endpoint, otherwise unloads the wallet specified in the argument.\n" 457 "Specifying the wallet name on a wallet endpoint is invalid.",
459 {
"wallet_name",
RPCArg::Type::STR,
RPCArg::DefaultHint{
"the wallet name from the RPC endpoint"},
"The name of the wallet to unload. If provided both here and in the RPC endpoint, the two must be identical."},
463 {
RPCResult::Type::ARR,
"warnings",
true,
"Warning messages, if any, related to unloading the wallet.",
474 std::string wallet_name;
476 if (!(request.params[0].isNull() || request.params[0].get_str() == wallet_name)) {
480 wallet_name = request.params[0].get_str();
489 std::vector<bilingual_str> warnings;
499 std::optional<bool> load_on_start{
self.MaybeArg<
bool>(
"load_on_startup")};
518 "\nSet or generate a new HD wallet seed. Non-HD wallets will not be upgraded to being a HD wallet. Wallets that are already\n" 519 "HD will have a new HD seed set so that new keys added to the keypool will be derived from this new seed.\n" 520 "\nNote that you will need to MAKE A NEW BACKUP of your wallet after setting the HD wallet seed." +
HELP_REQUIRING_PASSPHRASE +
521 "Note: This command is only compatible with legacy wallets.\n",
523 {
"newkeypool",
RPCArg::Type::BOOL,
RPCArg::Default{
true},
"Whether to flush old unused addresses, including change addresses, from the keypool and regenerate it.\n" 524 "If true, the next address from getnewaddress and change address from getrawchangeaddress will be from this new seed.\n" 525 "If false, addresses (including change addresses if the wallet already had HD Chain Split enabled) from the existing\n" 526 "keypool will be used until it has been depleted."},
528 "The seed value can be retrieved using the dumpwallet command. It is the private key marked hdseed=1"},
551 if (!pwallet->CanSupportFeature(
FEATURE_HD)) {
552 throw JSONRPCError(
RPC_WALLET_ERROR,
"Cannot set an HD seed on a non-HD wallet. Use the upgradewallet RPC in order to upgrade a non-HD wallet to HD");
557 bool flush_key_pool =
true;
558 if (!request.params[0].isNull()) {
559 flush_key_pool = request.params[0].get_bool();
563 if (request.params[1].isNull()) {
589 "\nUpgrade the wallet. Upgrades to the latest version if no version number is specified.\n" 590 "New keys may be generated and a new wallet backup will need to be made.",
616 if (!request.params[0].isNull()) {
617 version = request.params[0].getInt<
int>();
620 const int previous_version{pwallet->GetVersion()};
621 const bool wallet_upgraded{pwallet->UpgradeWallet(version, error)};
622 const int current_version{pwallet->GetVersion()};
625 if (wallet_upgraded) {
626 if (previous_version == current_version) {
627 result =
"Already at latest version. Wallet version unchanged.";
629 result =
strprintf(
"Wallet upgraded successfully from version %i to version %i.", previous_version, current_version);
634 obj.
pushKV(
"wallet_name", pwallet->GetName());
635 obj.
pushKV(
"previous_version", previous_version);
636 obj.
pushKV(
"current_version", current_version);
651 "\nCalculate the balance change resulting in the signing and broadcasting of the given transaction(s).\n",
683 if (request.params[1].isObject()) {
684 UniValue options = request.params[1];
691 include_watchonly = options[
"include_watchonly"];
699 const auto& txs = request.params[0].get_array();
701 std::map<COutPoint, CAmount> new_utxos;
702 std::set<COutPoint> spent;
704 for (
size_t i = 0; i < txs.size(); ++i) {
706 if (!
DecodeHexTx(mtx, txs[i].get_str(),
true,
true)) {
711 std::map<COutPoint, Coin> coins;
715 wallet.chain().findCoins(coins);
719 for (
const auto& txin : mtx.
vin) {
720 const auto& outpoint = txin.
prevout;
721 if (spent.count(outpoint)) {
724 if (new_utxos.count(outpoint)) {
725 changes -= new_utxos.at(outpoint);
726 new_utxos.erase(outpoint);
728 if (coins.at(outpoint).IsSpent()) {
731 changes -=
wallet.GetDebit(txin, filter);
733 spent.insert(outpoint);
741 const auto& hash = mtx.
GetHash();
742 for (
size_t i = 0; i < mtx.
vout.size(); ++i) {
743 const auto& txout = mtx.
vout[i];
744 bool is_mine = 0 < (
wallet.IsMine(txout) & filter);
745 changes += new_utxos[
COutPoint(hash, i)] = is_mine ? txout.nValue : 0;
760 "\nMigrate the wallet to a descriptor wallet.\n" 761 "A new wallet backup will need to be made.\n" 762 "\nThe migration process will create a backup of the wallet before migrating. This backup\n" 763 "file will be named <wallet name>-<timestamp>.legacy.bak and can be found in the directory\n" 764 "for this wallet. In the event of an incorrect migration, the backup can be restored using restorewallet." 765 "\nEncrypted wallets must have the passphrase provided as an argument to this call.\n" 766 "\nThis RPC may take a long time to complete. Increasing the RPC client timeout is recommended.",
768 {
"wallet_name",
RPCArg::Type::STR,
RPCArg::DefaultHint{
"the wallet name from the RPC endpoint"},
"The name of the wallet to migrate. If provided both here and in the RPC endpoint, the two must be identical."},
775 {
RPCResult::Type::STR,
"watchonly_name",
true,
"The name of the migrated wallet containing the watchonly scripts"},
776 {
RPCResult::Type::STR,
"solvables_name",
true,
"The name of the migrated wallet containing solvable but not watched scripts"},
786 std::string wallet_name;
788 if (!(request.params[0].isNull() || request.params[0].get_str() == wallet_name)) {
792 if (request.params[0].isNull()) {
795 wallet_name = request.params[0].get_str();
799 wallet_pass.reserve(100);
800 if (!request.params[1].isNull()) {
801 wallet_pass = std::string_view{request.params[1].get_str()};
811 r.pushKV(
"wallet_name", res->wallet_name);
812 if (res->watchonly_wallet) {
813 r.pushKV(
"watchonly_name", res->watchonly_wallet->GetName());
815 if (res->solvables_wallet) {
816 r.pushKV(
"solvables_name", res->solvables_wallet->GetName());
818 r.pushKV(
"backup_path", res->backup_path.utf8string());
829 "\nList all BIP 32 HD keys in the wallet and which descriptors use them.\n",
846 {
RPCResult::Type::BOOL,
"active",
"Whether this descriptor is currently used to generate new addresses"},
868 const bool active_only{options.exists(
"active_only") ? options[
"active_only"].get_bool() :
false};
869 const bool priv{options.exists(
"private") ? options[
"private"].get_bool() :
false};
875 std::set<ScriptPubKeyMan*> spkms;
877 spkms =
wallet->GetActiveScriptPubKeyMans();
879 spkms =
wallet->GetAllScriptPubKeyMans();
882 std::map<CExtPubKey, std::set<std::tuple<std::string, bool, bool>>> wallet_xpubs;
883 std::map<CExtPubKey, CExtKey> wallet_xprvs;
884 for (
auto* spkm : spkms) {
887 LOCK(desc_spkm->cs_desc_man);
891 std::set<CPubKey> desc_pubkeys;
892 std::set<CExtPubKey> desc_xpubs;
893 w_desc.
descriptor->GetPubKeys(desc_pubkeys, desc_xpubs);
895 std::string desc_str;
896 bool ok = desc_spkm->GetDescriptorString(desc_str,
false);
898 wallet_xpubs[xpub].emplace(desc_str,
wallet->IsActiveScriptPubKeyMan(*spkm), desc_spkm->HasPrivKey(xpub.pubkey.GetID()));
899 if (std::optional<CKey> key = priv ? desc_spkm->GetKey(xpub.pubkey.GetID()) : std::nullopt) {
900 wallet_xprvs[xpub] =
CExtKey(xpub, *key);
906 for (
const auto& [xpub, descs] : wallet_xpubs) {
907 bool has_xprv =
false;
909 for (
const auto& [desc, active, has_priv] : descs) {
912 d.
pushKV(
"active", active);
913 has_xprv |= has_priv;
919 xpub_info.
pushKV(
"has_private", has_xprv);
923 xpub_info.
pushKV(
"descriptors", std::move(descriptors));
925 response.
push_back(std::move(xpub_info));
936 "Creates the wallet's descriptor for the given address type. " 937 "The address type must be one that the wallet does not already have a descriptor for." 942 {
"internal",
RPCArg::Type::BOOL,
RPCArg::DefaultHint{
"Both external and internal will be generated unless this parameter is specified"},
"Whether to only make one descriptor that is internal (if parameter is true) or external (if parameter is false)"},
943 {
"hdkey",
RPCArg::Type::STR,
RPCArg::DefaultHint{
"The HD key used by all other active descriptors"},
"The HD key that the wallet knows the private key of, listed using 'gethdkeys', to use for this descriptor's key"},
968 std::optional<OutputType> output_type =
ParseOutputType(request.params[0].get_str());
974 UniValue internal_only{options[
"internal"]};
977 std::vector<bool> internals;
978 if (internal_only.isNull()) {
980 internals.push_back(
true);
982 internals.push_back(internal_only.get_bool());
985 LOCK(pwallet->cs_wallet);
989 if (hdkey.isNull()) {
990 std::set<CExtPubKey> active_xpubs = pwallet->GetActiveHDPubKeys();
991 if (active_xpubs.size() != 1) {
994 xpub = *active_xpubs.begin();
1002 std::optional<CKey> key = pwallet->GetKey(xpub.
pubkey.
GetID());
1006 CExtKey active_hdkey(xpub, *key);
1008 std::vector<std::reference_wrapper<DescriptorScriptPubKeyMan>> spkms;
1010 for (
bool internal : internals) {
1013 if (!pwallet->GetScriptPubKeyMan(w_id)) {
1014 spkms.emplace_back(pwallet->SetupDescriptorScriptPubKeyMan(batch, active_hdkey, *output_type,
internal));
1017 if (spkms.empty()) {
1023 for (
const auto& spkm : spkms) {
1024 std::string desc_str;
1025 bool ok = spkm.get().GetDescriptorString(desc_str,
false);
1027 descs.push_back(desc_str);
1030 out.pushKV(
"descs", std::move(descs));
1047 #ifdef ENABLE_EXTERNAL_SIGNER 1049 #endif // ENABLE_EXTERNAL_SIGNER 1175 #ifdef ENABLE_EXTERNAL_SIGNER 1177 #endif // ENABLE_EXTERNAL_SIGNER
RPCHelpMan importaddress()
RPCHelpMan importwallet()
void push_back(UniValue val)
void ReadDatabaseArgs(const ArgsManager &args, DatabaseOptions &options)
RPCHelpMan listlockunspent()
static RPCHelpMan listwalletdir()
RPCHelpMan simulaterawtransaction()
static RPCHelpMan setwalletflag()
std::string HelpExampleRpcNamed(const std::string &methodname, const RPCArgList &args)
void RPCTypeCheckObj(const UniValue &o, const std::map< std::string, UniValueType > &typesExpected, bool fAllowNull, bool fStrict)
RPCHelpMan restorewallet()
std::vector< std::pair< fs::path, std::string > > ListDatabases(const fs::path &wallet_dir)
Recursively list database paths in directory.
bool NewKeyPool()
Mark old keypool keys as used, and generate all new keys.
static RPCHelpMan loadwallet()
RecursiveMutex cs_KeyStore
RPCHelpMan walletpassphrase()
CPubKey GetPubKey() const
Compute the public key from a private key.
RPCHelpMan sendtoaddress()
RPCHelpMan getreceivedbylabel()
WalletDescriptor GenerateWalletDescriptor(const CExtPubKey &master_key, const OutputType &addr_type, bool internal)
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
std::shared_ptr< CWallet > LoadWallet(WalletContext &context, const std::string &name, std::optional< bool > load_on_start, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error, std::vector< bilingual_str > &warnings)
RPCHelpMan listtransactions()
RPCHelpMan abandontransaction()
#define CHECK_NONFATAL(condition)
Identity function.
Special type that behaves almost exactly like OBJ, defining an options object with a list of pre-defi...
static RPCHelpMan sethdseed()
std::basic_string< char, std::char_traits< char >, secure_allocator< char > > SecureString
bool ParseIncludeWatchonly(const UniValue &include_watchonly, const CWallet &wallet)
Used by RPC commands that have an include_watchonly parameter.
void SetHDSeed(const CPubKey &key)
const std::byte * end() const
RAII object to check and reserve a wallet rescan.
Balance GetBalance(const CWallet &wallet, const int min_depth, bool avoid_reuse)
static const RPCResult RESULT_LAST_PROCESSED_BLOCK
bool reserve(bool with_passphrase=false)
RPCHelpMan getaddressinfo()
Access to the wallet database.
fs::path GetWalletDir()
Get the path of the wallet directory.
consteval auto _(util::TranslatedLiteral str)
CExtPubKey DecodeExtPubKey(const std::string &str)
This same wallet is already loaded.
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Flag set when a wallet contains no HD seed and no private keys, scripts, addresses, and other watch only things, and is therefore "blank.".
Invalid, missing or duplicate parameter.
static constexpr uint64_t MUTABLE_WALLET_FLAGS
static RPCHelpMan getwalletinfo()
static RPCHelpMan unloadwallet()
RPCHelpMan rescanblockchain()
RPCHelpMan walletdisplayaddress()
void HandleWalletError(const std::shared_ptr< CWallet > wallet, DatabaseStatus &status, bilingual_str &error)
RPCHelpMan walletcreatefundedpsbt()
int64_t CAmount
Amount in satoshis (Can be negative)
Special type that is a STR with only hex chars.
RPCHelpMan walletpassphrasechange()
Indicates that the wallet needs an external signer.
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
RPCHelpMan fundrawtransaction()
static constexpr int64_t UNKNOWN_TIME
Constant representing an unknown spkm creation time.
std::underlying_type< isminetype >::type isminefilter
used for bitflags of isminetype
UniValue JSONRPCError(int code, const std::string &message)
void WaitForDeleteWallet(std::shared_ptr< CWallet > &&wallet)
Explicitly delete the wallet.
RPCHelpMan signrawtransactionwithwallet()
Special string with only hex chars.
SecureString create_passphrase
RPCHelpMan listsinceblock()
bool RemoveWallet(WalletContext &context, const std::shared_ptr< CWallet > &wallet, std::optional< bool > load_on_start)
RPCHelpMan walletprocesspsbt()
An input of a transaction.
static RPCHelpMan createwallet()
std::optional< OutputType > ParseOutputType(const std::string &type)
RPCHelpMan listreceivedbylabel()
std::shared_ptr< Descriptor > descriptor
An encapsulated public key.
WalletContext & EnsureWalletContext(const std::any &context)
RPCHelpMan listdescriptors()
Indicate that this wallet supports DescriptorScriptPubKeyMan.
const std::string CURRENCY_UNIT
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
General application defined errors.
std::string DefaultHint
Hint for default value.
std::string HelpExampleCliNamed(const std::string &methodname, const RPCArgList &args)
void PushWarnings(const UniValue &warnings, UniValue &obj)
Push warning messages to an RPC "warnings" field as a JSON array of strings.
bool IsCompressed() const
Check whether the public key corresponding to this private key is (to be) compressed.
void ReadDatabaseArgs(const ArgsManager &args, DBOptions &options)
Txid GetHash() const
Compute the hash of this CMutableTransaction.
Invalid wallet specified.
An outpoint - a combination of a transaction hash and an index n into its vout.
static const std::map< std::string, WalletFlags > WALLET_FLAG_MAP
std::string HelpExampleCli(const std::string &methodname, const std::string &args)
std::vector< CTxOut > vout
constexpr bool IsNull() const
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
util::Result< MigrationResult > MigrateLegacyToDescriptor(std::shared_ptr< CWallet > local_wallet, const SecureString &passphrase, WalletContext &context, bool was_loaded)
Requirement: The wallet provided to this function must be isolated, with no attachment to the node's ...
const std::string HELP_REQUIRING_PASSPHRASE
Special numeric to denote unix epoch time.
RPCHelpMan listreceivedbyaddress()
RPCHelpMan importdescriptors()
Descriptor with some wallet metadata.
LegacyScriptPubKeyMan & EnsureLegacyScriptPubKeyMan(CWallet &wallet, bool also_create)
RPCHelpMan encryptwallet()
std::shared_ptr< CWallet > GetWallet(WalletContext &context, const std::string &name)
RPCHelpMan importpubkey()
Failed to encrypt the wallet.
Optional argument for which the default value is omitted from help text for one of two reasons: ...
CPubKey DeriveNewSeed(const CKey &key)
std::string EncodeExtPubKey(const CExtPubKey &key)
RPCHelpMan getunconfirmedbalance()
std::vector< std::shared_ptr< CWallet > > GetWallets(WalletContext &context)
An interface to be implemented by keystores that support signing.
RPCHelpMan importprunedfunds()
Special string to represent a floating point amount.
void pushKV(std::string key, UniValue val)
CPubKey GenerateNewSeed()
RPCHelpMan gettransaction()
const std::byte * begin() const
RPCHelpMan getaddressesbylabel()
RPCHelpMan importprivkey()
A reference to a CKey: the Hash160 of its serialized public key.
bool DecodeHexTx(CMutableTransaction &tx, const std::string &hex_tx, bool try_no_witness=false, bool try_witness=true)
std::string GetHex() const
uint256 DescriptorID(const Descriptor &desc)
Unique identifier that may not change over time, unless explicitly marked as not backwards compatible...
bool HaveKey(const SigningProvider &wallet, const CKey &key)
Checks if a CKey is in the given CWallet compressed or otherwise.
UniValue ValueFromAmount(const CAmount amount)
WalletContext struct containing references to state shared between CWallet instances, like the reference to the chain interface, and the list of opened wallets.
void EnsureWalletIsUnlocked(const CWallet &wallet)
bilingual_str ErrorString(const Result< T > &result)
RPCHelpMan keypoolrefill()
interfaces::Chain * chain
A mutable version of CTransaction.
RPCHelpMan getreceivedbyaddress()
RPCHelpMan listaddressgroupings()
RPCHelpMan removeprunedfunds()
An encapsulated private key.
Span< const CRPCCommand > GetWalletRPCCommands()
A Span is an object that can refer to a contiguous sequence of objects.
RPCErrorCode
Bitcoin RPC error codes.
RPCHelpMan backupwallet()
CKey DecodeSecret(const std::string &str)
static RPCHelpMan migratewallet()
std::shared_ptr< CWallet > CreateWallet(WalletContext &context, const std::string &name, std::optional< bool > load_on_start, DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error, std::vector< bilingual_str > &warnings)
RPCHelpMan getnewaddress()
virtual bool rpcEnableDeprecated(const std::string &method)=0
Check if deprecated RPC is enabled.
static RPCHelpMan listwallets()
static RPCHelpMan createwalletdescriptor()
const CHDChain & GetHDChain() const
CKeyID seed_id
seed hash160
RPCHelpMan getrawchangeaddress()
std::string EncodeExtKey(const CExtKey &key)
static RPCHelpMan upgradewallet()
Wrapper for UniValue::VType, which includes typeAny: Used to denote don't care type.
void AppendLastProcessedBlock(UniValue &entry, const CWallet &wallet)
std::shared_ptr< CWallet > GetWalletForJSONRPCRequest(const JSONRPCRequest &request)
Figures out what wallet, if any, to use for a JSONRPCRequest.
static const std::map< uint64_t, std::string > WALLET_FLAG_CAVEATS
bool GetWalletNameFromJSONRPCRequest(const JSONRPCRequest &request, std::string &wallet_name)
Error parsing or validating structure in raw format.
const std::string UNIX_EPOCH_TIME
String used to describe UNIX epoch time in documentation, factored out to a constant for consistency...
RPCHelpMan addmultisigaddress()
bool IsValid() const
Check whether this private key is valid.