@ -93,6 +93,7 @@ bool GetWalletNameFromJSONRPCRequest(const JSONRPCRequest& request, std::string&
std : : shared_ptr < CWallet > GetWalletForJSONRPCRequest ( const JSONRPCRequest & request )
{
CHECK_NONFATAL ( ! request . fHelp ) ;
std : : string wallet_name ;
if ( GetWalletNameFromJSONRPCRequest ( request , wallet_name ) ) {
std : : shared_ptr < CWallet > pwallet = GetWallet ( wallet_name ) ;
@ -101,12 +102,10 @@ std::shared_ptr<CWallet> GetWalletForJSONRPCRequest(const JSONRPCRequest& reques
}
std : : vector < std : : shared_ptr < CWallet > > wallets = GetWallets ( ) ;
if ( wallets . size ( ) = = 1 | | ( request . fHelp & & wallets . size ( ) > 0 ) ) {
if ( wallets . size ( ) = = 1 ) {
return wallets [ 0 ] ;
}
if ( request . fHelp ) return nullptr ;
if ( ! HasWallets ( ) ) {
throw JSONRPCError (
RPC_METHOD_NOT_FOUND , " Method not found (wallet method is disabled because no wallet is loaded) " ) ;
@ -194,10 +193,6 @@ static std::string LabelFromValue(const UniValue& value)
static UniValue getnewaddress ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " getnewaddress " ,
" \n Returns a new Bitcoin address for receiving payments. \n "
" If 'label' is specified, it is added to the address book \n "
@ -215,6 +210,10 @@ static UniValue getnewaddress(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
if ( ! pwallet - > CanGetAddresses ( ) ) {
@ -244,10 +243,6 @@ static UniValue getnewaddress(const JSONRPCRequest& request)
static UniValue getrawchangeaddress ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " getrawchangeaddress " ,
" \n Returns a new Bitcoin address, for receiving change. \n "
" This is for use with raw transactions, NOT normal use. \n " ,
@ -263,6 +258,10 @@ static UniValue getrawchangeaddress(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
if ( ! pwallet - > CanGetAddresses ( true ) ) {
@ -287,10 +286,6 @@ static UniValue getrawchangeaddress(const JSONRPCRequest& request)
static UniValue setlabel ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " setlabel " ,
" \n Sets the label associated with the given address. \n " ,
{
@ -304,6 +299,10 @@ static UniValue setlabel(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
CTxDestination dest = DecodeDestination ( request . params [ 0 ] . get_str ( ) ) ;
@ -356,10 +355,6 @@ static CTransactionRef SendMoney(CWallet* const pwallet, const CTxDestination& a
static UniValue sendtoaddress ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " sendtoaddress " ,
" \n Send an amount to a given address. " +
HELP_REQUIRING_PASSPHRASE ,
@ -393,6 +388,10 @@ static UniValue sendtoaddress(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -448,10 +447,6 @@ static UniValue sendtoaddress(const JSONRPCRequest& request)
static UniValue listaddressgroupings ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " listaddressgroupings " ,
" \n Lists groups of addresses which have had their common ownership \n "
" made public by common use as inputs or as the resulting change \n "
@ -477,6 +472,10 @@ static UniValue listaddressgroupings(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -507,10 +506,6 @@ static UniValue listaddressgroupings(const JSONRPCRequest& request)
static UniValue signmessage ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " signmessage " ,
" \n Sign a message with the private key of an address " +
HELP_REQUIRING_PASSPHRASE ,
@ -533,6 +528,10 @@ static UniValue signmessage(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
EnsureWalletIsUnlocked ( pwallet ) ;
@ -609,10 +608,6 @@ static CAmount GetReceived(const CWallet& wallet, const UniValue& params, bool b
static UniValue getreceivedbyaddress ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " getreceivedbyaddress " ,
" \n Returns the total amount received by the given address in transactions with at least minconf confirmations. \n " ,
{
@ -634,6 +629,10 @@ static UniValue getreceivedbyaddress(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -646,10 +645,6 @@ static UniValue getreceivedbyaddress(const JSONRPCRequest& request)
static UniValue getreceivedbylabel ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " getreceivedbylabel " ,
" \n Returns the total amount received by addresses with <label> in transactions with at least [minconf] confirmations. \n " ,
{
@ -671,6 +666,10 @@ static UniValue getreceivedbylabel(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -683,10 +682,6 @@ static UniValue getreceivedbylabel(const JSONRPCRequest& request)
static UniValue getbalance ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " getbalance " ,
" \n Returns the total available balance. \n "
" The available balance is what the wallet considers currently spendable, and is \n "
@ -710,6 +705,10 @@ static UniValue getbalance(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -737,10 +736,6 @@ static UniValue getbalance(const JSONRPCRequest& request)
static UniValue getunconfirmedbalance ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " getunconfirmedbalance " ,
" DEPRECATED \n Identical to getbalances().mine.untrusted_pending \n " ,
{ } ,
@ -748,6 +743,10 @@ static UniValue getunconfirmedbalance(const JSONRPCRequest &request)
RPCExamples { " " } ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -760,10 +759,6 @@ static UniValue getunconfirmedbalance(const JSONRPCRequest &request)
static UniValue sendmany ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " sendmany " ,
" \n Send multiple times. Amounts are double-precision floating point numbers. " +
HELP_REQUIRING_PASSPHRASE ,
@ -807,6 +802,10 @@ static UniValue sendmany(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -891,10 +890,6 @@ static UniValue sendmany(const JSONRPCRequest& request)
static UniValue addmultisigaddress ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " addmultisigaddress " ,
" \n Add an nrequired-to-sign multisignature address to the wallet. Requires a new wallet backup. \n "
" Each key is a Bitcoin address or hex-encoded public key. \n "
@ -927,6 +922,10 @@ static UniValue addmultisigaddress(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
LegacyScriptPubKeyMan & spk_man = EnsureLegacyScriptPubKeyMan ( * pwallet ) ;
LOCK2 ( pwallet - > cs_wallet , spk_man . cs_KeyStore ) ;
@ -1130,10 +1129,6 @@ static UniValue ListReceived(const CWallet* const pwallet, const UniValue& param
static UniValue listreceivedbyaddress ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " listreceivedbyaddress " ,
" \n List balances by receiving address. \n " ,
{
@ -1167,6 +1162,10 @@ static UniValue listreceivedbyaddress(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -1178,10 +1177,6 @@ static UniValue listreceivedbyaddress(const JSONRPCRequest& request)
static UniValue listreceivedbylabel ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " listreceivedbylabel " ,
" \n List received transactions by label. \n " ,
{
@ -1208,6 +1203,10 @@ static UniValue listreceivedbylabel(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -1336,10 +1335,6 @@ static const std::vector<RPCResult> TransactionDescriptionString()
UniValue listtransactions ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " listtransactions " ,
" \n If a label name is provided, this will return only incoming transactions paying to addresses with the specified label. \n "
" \n Returns up to 'count' most recent transactions skipping the first 'from' transactions. \n " ,
@ -1387,6 +1382,10 @@ UniValue listtransactions(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -1446,9 +1445,6 @@ UniValue listtransactions(const JSONRPCRequest& request)
static UniValue listsinceblock ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const pwallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! pwallet ) return NullUniValue ;
RPCHelpMan { " listsinceblock " ,
" \n Get all transactions in blocks since block [blockhash], or all transactions if omitted. \n "
" If \" blockhash \" is no longer a part of the main chain, transactions from the fork point onward are included. \n "
@ -1502,6 +1498,9 @@ static UniValue listsinceblock(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const pwallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! pwallet ) return NullUniValue ;
const CWallet & wallet = * pwallet ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
@ -1584,10 +1583,6 @@ static UniValue listsinceblock(const JSONRPCRequest& request)
static UniValue gettransaction ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " gettransaction " ,
" \n Get detailed information about in-wallet transaction <txid> \n " ,
{
@ -1642,6 +1637,10 @@ static UniValue gettransaction(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -1694,10 +1693,6 @@ static UniValue gettransaction(const JSONRPCRequest& request)
static UniValue abandontransaction ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " abandontransaction " ,
" \n Mark in-wallet transaction <txid> as abandoned \n "
" This will mark this transaction and all its in-wallet descendants as abandoned which will allow \n "
@ -1714,6 +1709,10 @@ static UniValue abandontransaction(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -1735,10 +1734,6 @@ static UniValue abandontransaction(const JSONRPCRequest& request)
static UniValue backupwallet ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " backupwallet " ,
" \n Safely copies current wallet file to destination, which can be a directory or a path with filename. \n " ,
{
@ -1751,6 +1746,10 @@ static UniValue backupwallet(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -1768,10 +1767,6 @@ static UniValue backupwallet(const JSONRPCRequest& request)
static UniValue keypoolrefill ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " keypoolrefill " ,
" \n Fills the keypool. " +
HELP_REQUIRING_PASSPHRASE ,
@ -1785,6 +1780,10 @@ static UniValue keypoolrefill(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
if ( pwallet - > IsLegacy ( ) & & pwallet - > IsWalletFlagSet ( WALLET_FLAG_DISABLE_PRIVATE_KEYS ) ) {
throw JSONRPCError ( RPC_WALLET_ERROR , " Error: Private keys are disabled for this wallet " ) ;
}
@ -1812,10 +1811,6 @@ static UniValue keypoolrefill(const JSONRPCRequest& request)
static UniValue walletpassphrase ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " walletpassphrase " ,
" \n Stores the wallet decryption key in memory for 'timeout' seconds. \n "
" This is needed prior to performing transactions related to private keys such as sending bitcoins \n "
@ -1837,6 +1832,10 @@ static UniValue walletpassphrase(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
int64_t nSleepTime ;
int64_t relock_time ;
// Prevent concurrent calls to walletpassphrase with the same wallet.
@ -1906,10 +1905,6 @@ static UniValue walletpassphrase(const JSONRPCRequest& request)
static UniValue walletpassphrasechange ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " walletpassphrasechange " ,
" \n Changes the wallet passphrase from 'oldpassphrase' to 'newpassphrase'. \n " ,
{
@ -1923,6 +1918,10 @@ static UniValue walletpassphrasechange(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
if ( ! pwallet - > IsCrypted ( ) ) {
@ -1953,10 +1952,6 @@ static UniValue walletpassphrasechange(const JSONRPCRequest& request)
static UniValue walletlock ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " walletlock " ,
" \n Removes the wallet encryption key from memory, locking the wallet. \n "
" After calling this method, you will need to call walletpassphrase again \n "
@ -1975,6 +1970,10 @@ static UniValue walletlock(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
if ( ! pwallet - > IsCrypted ( ) ) {
@ -1990,10 +1989,6 @@ static UniValue walletlock(const JSONRPCRequest& request)
static UniValue encryptwallet ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " encryptwallet " ,
" \n Encrypts the wallet with 'passphrase'. This is for first time encryption. \n "
" After this, any calls that interact with private keys such as sending or signing \n "
@ -2018,6 +2013,10 @@ static UniValue encryptwallet(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
if ( pwallet - > IsWalletFlagSet ( WALLET_FLAG_DISABLE_PRIVATE_KEYS ) ) {
@ -2047,10 +2046,6 @@ static UniValue encryptwallet(const JSONRPCRequest& request)
static UniValue lockunspent ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " lockunspent " ,
" \n Updates list of temporarily unspendable outputs. \n "
" Temporarily lock (unlock=false) or unlock (unlock=true) specified transaction outputs. \n "
@ -2089,6 +2084,10 @@ static UniValue lockunspent(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -2170,10 +2169,6 @@ static UniValue lockunspent(const JSONRPCRequest& request)
static UniValue listlockunspent ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " listlockunspent " ,
" \n Returns list of temporarily unspendable outputs. \n "
" See the lockunspent call to lock and unlock transactions for spending. \n " ,
@ -2202,6 +2197,10 @@ static UniValue listlockunspent(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
std : : vector < COutPoint > vOutpts ;
@ -2222,10 +2221,6 @@ static UniValue listlockunspent(const JSONRPCRequest& request)
static UniValue settxfee ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " settxfee " ,
" \n Set the transaction fee per kB for this wallet. Overrides the global -paytxfee command line parameter. \n "
" Can be deactivated by passing 0 as the fee. In that case automatic fee selection will be used by default. \n " ,
@ -2241,6 +2236,10 @@ static UniValue settxfee(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
CAmount nAmount = AmountFromValue ( request . params [ 0 ] ) ;
@ -2262,10 +2261,6 @@ static UniValue settxfee(const JSONRPCRequest& request)
static UniValue getbalances ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const rpc_wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! rpc_wallet ) return NullUniValue ;
CWallet & wallet = * rpc_wallet ;
RPCHelpMan {
" getbalances " ,
" Returns an object with all balances in " + CURRENCY_UNIT + " . \n " ,
@ -2293,6 +2288,10 @@ static UniValue getbalances(const JSONRPCRequest& request)
HelpExampleRpc ( " getbalances " , " " ) } ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const rpc_wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! rpc_wallet ) return NullUniValue ;
CWallet & wallet = * rpc_wallet ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
wallet . BlockUntilSyncedToCurrentChain ( ) ;
@ -2327,10 +2326,6 @@ static UniValue getbalances(const JSONRPCRequest& request)
static UniValue getwalletinfo ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " getwalletinfo " ,
" Returns an object containing various wallet state info. \n " ,
{ } ,
@ -2366,6 +2361,10 @@ static UniValue getwalletinfo(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
pwallet - > BlockUntilSyncedToCurrentChain ( ) ;
@ -2529,10 +2528,6 @@ static UniValue loadwallet(const JSONRPCRequest& request)
static UniValue setwalletflag ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
std : : string flags = " " ;
for ( auto & it : WALLET_FLAG_MAP )
if ( it . second & MUTABLE_WALLET_FLAGS )
@ -2557,6 +2552,10 @@ static UniValue setwalletflag(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
std : : string flag_str = request . params [ 0 ] . get_str ( ) ;
bool value = request . params [ 1 ] . isNull ( ) | | request . params [ 1 ] . get_bool ( ) ;
@ -2709,10 +2708,6 @@ static UniValue unloadwallet(const JSONRPCRequest& request)
static UniValue listunspent ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan {
" listunspent " ,
" \n Returns array of unspent transaction outputs \n "
@ -2770,6 +2765,10 @@ static UniValue listunspent(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
int nMinDepth = 1 ;
if ( ! request . params [ 0 ] . isNull ( ) ) {
RPCTypeCheckArgument ( request . params [ 0 ] , UniValue : : VNUM ) ;
@ -3039,10 +3038,6 @@ void FundTransaction(CWallet* const pwallet, CMutableTransaction& tx, CAmount& f
static UniValue fundrawtransaction ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " fundrawtransaction " ,
" \n Add inputs to a transaction until it has enough in value to meet its out value. \n "
" This will not modify existing inputs, and will add at most one change output to the outputs. \n "
@ -3112,6 +3107,10 @@ static UniValue fundrawtransaction(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCTypeCheck ( request . params , { UniValue : : VSTR , UniValueType ( ) , UniValue : : VBOOL } ) ;
// parse hex string from parameter
@ -3136,10 +3135,6 @@ static UniValue fundrawtransaction(const JSONRPCRequest& request)
UniValue signrawtransactionwithwallet ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " signrawtransactionwithwallet " ,
" \n Sign inputs for raw transaction (serialized, hex-encoded). \n "
" The second optional argument (may be null) is an array of previous transaction outputs that \n "
@ -3193,6 +3188,10 @@ UniValue signrawtransactionwithwallet(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCTypeCheck ( request . params , { UniValue : : VSTR , UniValue : : VARR , UniValue : : VSTR } , true ) ;
CMutableTransaction mtx ;
@ -3227,10 +3226,6 @@ UniValue signrawtransactionwithwallet(const JSONRPCRequest& request)
static UniValue bumpfee ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " bumpfee " ,
" \n Bumps the fee of an opt-in-RBF transaction T, replacing it with a new transaction B. \n "
" An opt-in RBF transaction with the given txid must be in the wallet. \n "
@ -3282,6 +3277,10 @@ static UniValue bumpfee(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCTypeCheck ( request . params , { UniValue : : VSTR , UniValue : : VOBJ } ) ;
uint256 hash ( ParseHashV ( request . params [ 0 ] , " txid " ) ) ;
@ -3396,10 +3395,6 @@ static UniValue bumpfee(const JSONRPCRequest& request)
UniValue rescanblockchain ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " rescanblockchain " ,
" \n Rescan the local blockchain for wallet related transactions. \n "
" Note: Use \" getwalletinfo \" to query the scanning progress. \n " ,
@ -3420,6 +3415,10 @@ UniValue rescanblockchain(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
WalletRescanReserver reserver ( * pwallet ) ;
if ( ! reserver . reserve ( ) ) {
throw JSONRPCError ( RPC_WALLET_ERROR , " Wallet is currently rescanning. Abort existing rescan or wait. " ) ;
@ -3592,10 +3591,6 @@ static UniValue AddressBookDataToJSON(const CAddressBookData& data, const bool v
UniValue getaddressinfo ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " getaddressinfo " ,
" \n Return information about the given bitcoin address. \n "
" Some of the information will only be present if the address is in the active wallet. \n " ,
@ -3656,6 +3651,10 @@ UniValue getaddressinfo(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
UniValue ret ( UniValue : : VOBJ ) ;
@ -3732,10 +3731,6 @@ UniValue getaddressinfo(const JSONRPCRequest& request)
static UniValue getaddressesbylabel ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " getaddressesbylabel " ,
" \n Returns the list of addresses assigned the specified label. \n " ,
{
@ -3756,6 +3751,10 @@ static UniValue getaddressesbylabel(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
std : : string label = LabelFromValue ( request . params [ 0 ] ) ;
@ -3789,10 +3788,6 @@ static UniValue getaddressesbylabel(const JSONRPCRequest& request)
static UniValue listlabels ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " listlabels " ,
" \n Returns the list of all labels, or labels that are assigned to addresses with a specific purpose. \n " ,
{
@ -3816,6 +3811,10 @@ static UniValue listlabels(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
LOCK ( pwallet - > cs_wallet ) ;
std : : string purpose ;
@ -3842,10 +3841,6 @@ static UniValue listlabels(const JSONRPCRequest& request)
UniValue sethdseed ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " sethdseed " ,
" \n Set or generate a new HD wallet seed. Non-HD wallets will not be upgraded to being a HD wallet. Wallets that are already \n "
" HD will have a new HD seed set so that new keys added to the keypool will be derived from this new seed. \n "
@ -3868,6 +3863,10 @@ UniValue sethdseed(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
LegacyScriptPubKeyMan & spk_man = EnsureLegacyScriptPubKeyMan ( * pwallet , true ) ;
if ( pwallet - > IsWalletFlagSet ( WALLET_FLAG_DISABLE_PRIVATE_KEYS ) ) {
@ -3912,10 +3911,6 @@ UniValue sethdseed(const JSONRPCRequest& request)
UniValue walletprocesspsbt ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " walletprocesspsbt " ,
" \n Update a PSBT with input information from our wallet and then sign inputs \n "
" that we can sign for. " +
@ -3944,6 +3939,10 @@ UniValue walletprocesspsbt(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
const CWallet * const pwallet = wallet . get ( ) ;
RPCTypeCheck ( request . params , { UniValue : : VSTR , UniValue : : VBOOL , UniValue : : VSTR } ) ;
// Unserialize the transaction
@ -3976,10 +3975,6 @@ UniValue walletprocesspsbt(const JSONRPCRequest& request)
UniValue walletcreatefundedpsbt ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " walletcreatefundedpsbt " ,
" \n Creates and funds a transaction in the Partially Signed Transaction format. Inputs will be added if supplied inputs are not enough \n "
" Implements the Creator and Updater roles. \n " ,
@ -4054,6 +4049,10 @@ UniValue walletcreatefundedpsbt(const JSONRPCRequest& request)
} ,
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCTypeCheck ( request . params , {
UniValue : : VARR ,
UniValueType ( ) , // ARR or OBJ, checked later
@ -4098,10 +4097,6 @@ UniValue walletcreatefundedpsbt(const JSONRPCRequest& request)
static UniValue upgradewallet ( const JSONRPCRequest & request )
{
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCHelpMan { " upgradewallet " ,
" \n Upgrade the wallet. Upgrades to the latest version if no version number is specified \n "
" New keys may be generated and a new wallet backup will need to be made. " ,
@ -4115,6 +4110,10 @@ static UniValue upgradewallet(const JSONRPCRequest& request)
}
} . Check ( request ) ;
std : : shared_ptr < CWallet > const wallet = GetWalletForJSONRPCRequest ( request ) ;
if ( ! wallet ) return NullUniValue ;
CWallet * const pwallet = wallet . get ( ) ;
RPCTypeCheck ( request . params , { UniValue : : VNUM } , true ) ;
EnsureWalletIsUnlocked ( pwallet ) ;