mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-11 12:22:39 -03:00
rpc: refactor rpc wallet functions to take references instead of pointers
Co-authored-by: MarcoFalke <falke.marco@gmail.com> Co-authored-by: João Barbosa <joao.paulo.barbosa@gmail.com>
This commit is contained in:
parent
4866934008
commit
7c90c67b7e
3 changed files with 85 additions and 86 deletions
|
@ -56,13 +56,13 @@ static std::string DecodeDumpString(const std::string &str) {
|
||||||
return ret.str();
|
return ret.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool GetWalletAddressesForKey(LegacyScriptPubKeyMan* spk_man, const CWallet* const pwallet, const CKeyID& keyid, std::string& strAddr, std::string& strLabel) EXCLUSIVE_LOCKS_REQUIRED(pwallet->cs_wallet)
|
static bool GetWalletAddressesForKey(LegacyScriptPubKeyMan* spk_man, const CWallet& wallet, const CKeyID& keyid, std::string& strAddr, std::string& strLabel) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
|
||||||
{
|
{
|
||||||
bool fLabelFound = false;
|
bool fLabelFound = false;
|
||||||
CKey key;
|
CKey key;
|
||||||
spk_man->GetKey(keyid, key);
|
spk_man->GetKey(keyid, key);
|
||||||
for (const auto& dest : GetAllDestinationsForKey(key.GetPubKey())) {
|
for (const auto& dest : GetAllDestinationsForKey(key.GetPubKey())) {
|
||||||
const auto* address_book_entry = pwallet->FindAddressBookEntry(dest);
|
const auto* address_book_entry = wallet.FindAddressBookEntry(dest);
|
||||||
if (address_book_entry) {
|
if (address_book_entry) {
|
||||||
if (!strAddr.empty()) {
|
if (!strAddr.empty()) {
|
||||||
strAddr += ",";
|
strAddr += ",";
|
||||||
|
@ -73,7 +73,7 @@ static bool GetWalletAddressesForKey(LegacyScriptPubKeyMan* spk_man, const CWall
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!fLabelFound) {
|
if (!fLabelFound) {
|
||||||
strAddr = EncodeDestination(GetDestinationForKey(key.GetPubKey(), pwallet->m_default_address_type));
|
strAddr = EncodeDestination(GetDestinationForKey(key.GetPubKey(), wallet.m_default_address_type));
|
||||||
}
|
}
|
||||||
return fLabelFound;
|
return fLabelFound;
|
||||||
}
|
}
|
||||||
|
@ -132,7 +132,7 @@ RPCHelpMan importprivkey()
|
||||||
{
|
{
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
std::string strSecret = request.params[0].get_str();
|
std::string strSecret = request.params[0].get_str();
|
||||||
std::string strLabel = "";
|
std::string strLabel = "";
|
||||||
|
@ -543,7 +543,7 @@ RPCHelpMan importwallet()
|
||||||
{
|
{
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
fsbridge::ifstream file;
|
fsbridge::ifstream file;
|
||||||
file.open(request.params[0].get_str(), std::ios::in | std::ios::ate);
|
file.open(request.params[0].get_str(), std::ios::in | std::ios::ate);
|
||||||
|
@ -684,7 +684,7 @@ RPCHelpMan dumpprivkey()
|
||||||
|
|
||||||
LOCK2(pwallet->cs_wallet, spk_man.cs_KeyStore);
|
LOCK2(pwallet->cs_wallet, spk_man.cs_KeyStore);
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
std::string strAddress = request.params[0].get_str();
|
std::string strAddress = request.params[0].get_str();
|
||||||
CTxDestination dest = DecodeDestination(strAddress);
|
CTxDestination dest = DecodeDestination(strAddress);
|
||||||
|
@ -739,7 +739,7 @@ RPCHelpMan dumpwallet()
|
||||||
|
|
||||||
LOCK2(wallet.cs_wallet, spk_man.cs_KeyStore);
|
LOCK2(wallet.cs_wallet, spk_man.cs_KeyStore);
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(&wallet);
|
EnsureWalletIsUnlocked(wallet);
|
||||||
|
|
||||||
fs::path filepath = request.params[0].get_str();
|
fs::path filepath = request.params[0].get_str();
|
||||||
filepath = fs::absolute(filepath);
|
filepath = fs::absolute(filepath);
|
||||||
|
@ -801,7 +801,7 @@ RPCHelpMan dumpwallet()
|
||||||
CKey key;
|
CKey key;
|
||||||
if (spk_man.GetKey(keyid, key)) {
|
if (spk_man.GetKey(keyid, key)) {
|
||||||
file << strprintf("%s %s ", EncodeSecret(key), strTime);
|
file << strprintf("%s %s ", EncodeSecret(key), strTime);
|
||||||
if (GetWalletAddressesForKey(&spk_man, &wallet, keyid, strAddr, strLabel)) {
|
if (GetWalletAddressesForKey(&spk_man, wallet, keyid, strAddr, strLabel)) {
|
||||||
file << strprintf("label=%s", strLabel);
|
file << strprintf("label=%s", strLabel);
|
||||||
} else if (keyid == seed_id) {
|
} else if (keyid == seed_id) {
|
||||||
file << "hdseed=1";
|
file << "hdseed=1";
|
||||||
|
@ -1161,7 +1161,7 @@ static UniValue ProcessImportDescriptor(ImportData& import_data, std::map<CKeyID
|
||||||
return warnings;
|
return warnings;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniValue ProcessImport(CWallet * const pwallet, const UniValue& data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(pwallet->cs_wallet)
|
static UniValue ProcessImport(CWallet& wallet, const UniValue& data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
|
||||||
{
|
{
|
||||||
UniValue warnings(UniValue::VARR);
|
UniValue warnings(UniValue::VARR);
|
||||||
UniValue result(UniValue::VOBJ);
|
UniValue result(UniValue::VOBJ);
|
||||||
|
@ -1176,7 +1176,7 @@ static UniValue ProcessImport(CWallet * const pwallet, const UniValue& data, con
|
||||||
const bool add_keypool = data.exists("keypool") ? data["keypool"].get_bool() : false;
|
const bool add_keypool = data.exists("keypool") ? data["keypool"].get_bool() : false;
|
||||||
|
|
||||||
// Add to keypool only works with privkeys disabled
|
// Add to keypool only works with privkeys disabled
|
||||||
if (add_keypool && !pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
if (add_keypool && !wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Keys can only be imported to the keypool when private keys are disabled");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Keys can only be imported to the keypool when private keys are disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1198,29 +1198,29 @@ static UniValue ProcessImport(CWallet * const pwallet, const UniValue& data, con
|
||||||
}
|
}
|
||||||
|
|
||||||
// If private keys are disabled, abort if private keys are being imported
|
// If private keys are disabled, abort if private keys are being imported
|
||||||
if (pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) && !privkey_map.empty()) {
|
if (wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) && !privkey_map.empty()) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import private keys to a wallet with private keys disabled");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import private keys to a wallet with private keys disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check whether we have any work to do
|
// Check whether we have any work to do
|
||||||
for (const CScript& script : script_pub_keys) {
|
for (const CScript& script : script_pub_keys) {
|
||||||
if (pwallet->IsMine(script) & ISMINE_SPENDABLE) {
|
if (wallet.IsMine(script) & ISMINE_SPENDABLE) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "The wallet already contains the private key for this address or script (\"" + HexStr(script) + "\")");
|
throw JSONRPCError(RPC_WALLET_ERROR, "The wallet already contains the private key for this address or script (\"" + HexStr(script) + "\")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// All good, time to import
|
// All good, time to import
|
||||||
pwallet->MarkDirty();
|
wallet.MarkDirty();
|
||||||
if (!pwallet->ImportScripts(import_data.import_scripts, timestamp)) {
|
if (!wallet.ImportScripts(import_data.import_scripts, timestamp)) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding script to wallet");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding script to wallet");
|
||||||
}
|
}
|
||||||
if (!pwallet->ImportPrivKeys(privkey_map, timestamp)) {
|
if (!wallet.ImportPrivKeys(privkey_map, timestamp)) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding key to wallet");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding key to wallet");
|
||||||
}
|
}
|
||||||
if (!pwallet->ImportPubKeys(ordered_pubkeys, pubkey_map, import_data.key_origins, add_keypool, internal, timestamp)) {
|
if (!wallet.ImportPubKeys(ordered_pubkeys, pubkey_map, import_data.key_origins, add_keypool, internal, timestamp)) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding address to wallet");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding address to wallet");
|
||||||
}
|
}
|
||||||
if (!pwallet->ImportScriptPubKeys(label, script_pub_keys, have_solving_data, !internal, timestamp)) {
|
if (!wallet.ImportScriptPubKeys(label, script_pub_keys, have_solving_data, !internal, timestamp)) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding address to wallet");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding address to wallet");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1359,7 +1359,7 @@ RPCHelpMan importmulti()
|
||||||
UniValue response(UniValue::VARR);
|
UniValue response(UniValue::VARR);
|
||||||
{
|
{
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
// Verify all timestamps are present before importing any keys.
|
// Verify all timestamps are present before importing any keys.
|
||||||
CHECK_NONFATAL(pwallet->chain().findBlock(pwallet->GetLastBlockHash(), FoundBlock().time(nLowestTimestamp).mtpTime(now)));
|
CHECK_NONFATAL(pwallet->chain().findBlock(pwallet->GetLastBlockHash(), FoundBlock().time(nLowestTimestamp).mtpTime(now)));
|
||||||
|
@ -1371,7 +1371,7 @@ RPCHelpMan importmulti()
|
||||||
|
|
||||||
for (const UniValue& data : requests.getValues()) {
|
for (const UniValue& data : requests.getValues()) {
|
||||||
const int64_t timestamp = std::max(GetImportTimestamp(data, now), minimumTimestamp);
|
const int64_t timestamp = std::max(GetImportTimestamp(data, now), minimumTimestamp);
|
||||||
const UniValue result = ProcessImport(pwallet.get(), data, timestamp);
|
const UniValue result = ProcessImport(*pwallet, data, timestamp);
|
||||||
response.push_back(result);
|
response.push_back(result);
|
||||||
|
|
||||||
if (!fRescan) {
|
if (!fRescan) {
|
||||||
|
@ -1438,7 +1438,7 @@ RPCHelpMan importmulti()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniValue ProcessDescriptorImport(CWallet * const pwallet, const UniValue& data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(pwallet->cs_wallet)
|
static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, const int64_t timestamp) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
|
||||||
{
|
{
|
||||||
UniValue warnings(UniValue::VARR);
|
UniValue warnings(UniValue::VARR);
|
||||||
UniValue result(UniValue::VOBJ);
|
UniValue result(UniValue::VOBJ);
|
||||||
|
@ -1507,7 +1507,7 @@ static UniValue ProcessDescriptorImport(CWallet * const pwallet, const UniValue&
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the wallet disabled private keys, abort if private keys exist
|
// If the wallet disabled private keys, abort if private keys exist
|
||||||
if (pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) && !keys.keys.empty()) {
|
if (wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS) && !keys.keys.empty()) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import private keys to a wallet with private keys disabled");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import private keys to a wallet with private keys disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1531,7 +1531,7 @@ static UniValue ProcessDescriptorImport(CWallet * const pwallet, const UniValue&
|
||||||
}
|
}
|
||||||
|
|
||||||
// If private keys are enabled, check some things.
|
// If private keys are enabled, check some things.
|
||||||
if (!pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
if (!wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
||||||
if (keys.keys.empty()) {
|
if (keys.keys.empty()) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import descriptor without private keys to a wallet with private keys enabled");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Cannot import descriptor without private keys to a wallet with private keys enabled");
|
||||||
}
|
}
|
||||||
|
@ -1543,7 +1543,7 @@ static UniValue ProcessDescriptorImport(CWallet * const pwallet, const UniValue&
|
||||||
WalletDescriptor w_desc(std::move(parsed_desc), timestamp, range_start, range_end, next_index);
|
WalletDescriptor w_desc(std::move(parsed_desc), timestamp, range_start, range_end, next_index);
|
||||||
|
|
||||||
// Check if the wallet already contains the descriptor
|
// Check if the wallet already contains the descriptor
|
||||||
auto existing_spk_manager = pwallet->GetDescriptorScriptPubKeyMan(w_desc);
|
auto existing_spk_manager = wallet.GetDescriptorScriptPubKeyMan(w_desc);
|
||||||
if (existing_spk_manager) {
|
if (existing_spk_manager) {
|
||||||
LOCK(existing_spk_manager->cs_desc_man);
|
LOCK(existing_spk_manager->cs_desc_man);
|
||||||
if (range_start > existing_spk_manager->GetWalletDescriptor().range_start) {
|
if (range_start > existing_spk_manager->GetWalletDescriptor().range_start) {
|
||||||
|
@ -1552,7 +1552,7 @@ static UniValue ProcessDescriptorImport(CWallet * const pwallet, const UniValue&
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add descriptor to the wallet
|
// Add descriptor to the wallet
|
||||||
auto spk_manager = pwallet->AddWalletDescriptor(w_desc, keys, label, internal);
|
auto spk_manager = wallet.AddWalletDescriptor(w_desc, keys, label, internal);
|
||||||
if (spk_manager == nullptr) {
|
if (spk_manager == nullptr) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Could not add descriptor '%s'", descriptor));
|
throw JSONRPCError(RPC_WALLET_ERROR, strprintf("Could not add descriptor '%s'", descriptor));
|
||||||
}
|
}
|
||||||
|
@ -1562,7 +1562,7 @@ static UniValue ProcessDescriptorImport(CWallet * const pwallet, const UniValue&
|
||||||
if (!w_desc.descriptor->GetOutputType()) {
|
if (!w_desc.descriptor->GetOutputType()) {
|
||||||
warnings.push_back("Unknown output type, cannot set descriptor to active.");
|
warnings.push_back("Unknown output type, cannot set descriptor to active.");
|
||||||
} else {
|
} else {
|
||||||
pwallet->AddActiveScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), internal);
|
wallet.AddActiveScriptPubKeyMan(spk_manager->GetID(), *w_desc.descriptor->GetOutputType(), internal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1655,7 +1655,7 @@ RPCHelpMan importdescriptors()
|
||||||
UniValue response(UniValue::VARR);
|
UniValue response(UniValue::VARR);
|
||||||
{
|
{
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
CHECK_NONFATAL(pwallet->chain().findBlock(pwallet->GetLastBlockHash(), FoundBlock().time(lowest_timestamp).mtpTime(now)));
|
CHECK_NONFATAL(pwallet->chain().findBlock(pwallet->GetLastBlockHash(), FoundBlock().time(lowest_timestamp).mtpTime(now)));
|
||||||
|
|
||||||
|
@ -1663,7 +1663,7 @@ RPCHelpMan importdescriptors()
|
||||||
for (const UniValue& request : requests.getValues()) {
|
for (const UniValue& request : requests.getValues()) {
|
||||||
// This throws an error if "timestamp" doesn't exist
|
// This throws an error if "timestamp" doesn't exist
|
||||||
const int64_t timestamp = std::max(GetImportTimestamp(request, now), minimum_timestamp);
|
const int64_t timestamp = std::max(GetImportTimestamp(request, now), minimum_timestamp);
|
||||||
const UniValue result = ProcessDescriptorImport(pwallet.get(), request, timestamp);
|
const UniValue result = ProcessDescriptorImport(*pwallet, request, timestamp);
|
||||||
response.push_back(result);
|
response.push_back(result);
|
||||||
|
|
||||||
if (lowest_timestamp > timestamp ) {
|
if (lowest_timestamp > timestamp ) {
|
||||||
|
@ -1765,7 +1765,7 @@ RPCHelpMan listdescriptors()
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "listdescriptors is not available for non-descriptor wallets");
|
throw JSONRPCError(RPC_WALLET_ERROR, "listdescriptors is not available for non-descriptor wallets");
|
||||||
}
|
}
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(wallet.get());
|
EnsureWalletIsUnlocked(*wallet);
|
||||||
|
|
||||||
LOCK(wallet->cs_wallet);
|
LOCK(wallet->cs_wallet);
|
||||||
|
|
||||||
|
|
|
@ -48,8 +48,8 @@ using interfaces::FoundBlock;
|
||||||
static const std::string WALLET_ENDPOINT_BASE = "/wallet/";
|
static const std::string WALLET_ENDPOINT_BASE = "/wallet/";
|
||||||
static const std::string HELP_REQUIRING_PASSPHRASE{"\nRequires wallet passphrase to be set with walletpassphrase call if wallet is encrypted.\n"};
|
static const std::string HELP_REQUIRING_PASSPHRASE{"\nRequires wallet passphrase to be set with walletpassphrase call if wallet is encrypted.\n"};
|
||||||
|
|
||||||
static inline bool GetAvoidReuseFlag(const CWallet* const pwallet, const UniValue& param) {
|
static inline bool GetAvoidReuseFlag(const CWallet& wallet, const UniValue& param) {
|
||||||
bool can_avoid_reuse = pwallet->IsWalletFlagSet(WALLET_FLAG_AVOID_REUSE);
|
bool can_avoid_reuse = wallet.IsWalletFlagSet(WALLET_FLAG_AVOID_REUSE);
|
||||||
bool avoid_reuse = param.isNull() ? can_avoid_reuse : param.get_bool();
|
bool avoid_reuse = param.isNull() ? can_avoid_reuse : param.get_bool();
|
||||||
|
|
||||||
if (avoid_reuse && !can_avoid_reuse) {
|
if (avoid_reuse && !can_avoid_reuse) {
|
||||||
|
@ -64,11 +64,11 @@ static inline bool GetAvoidReuseFlag(const CWallet* const pwallet, const UniValu
|
||||||
* We default to true for watchonly wallets if include_watchonly isn't
|
* We default to true for watchonly wallets if include_watchonly isn't
|
||||||
* explicitly set.
|
* explicitly set.
|
||||||
*/
|
*/
|
||||||
static bool ParseIncludeWatchonly(const UniValue& include_watchonly, const CWallet& pwallet)
|
static bool ParseIncludeWatchonly(const UniValue& include_watchonly, const CWallet& wallet)
|
||||||
{
|
{
|
||||||
if (include_watchonly.isNull()) {
|
if (include_watchonly.isNull()) {
|
||||||
// if include_watchonly isn't explicitly set, then check if we have a watchonly wallet
|
// if include_watchonly isn't explicitly set, then check if we have a watchonly wallet
|
||||||
return pwallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS);
|
return wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
// otherwise return whatever include_watchonly was set to
|
// otherwise return whatever include_watchonly was set to
|
||||||
|
@ -117,9 +117,9 @@ std::shared_ptr<CWallet> GetWalletForJSONRPCRequest(const JSONRPCRequest& reques
|
||||||
"Wallet file not specified (must request wallet RPC through /wallet/<filename> uri-path).");
|
"Wallet file not specified (must request wallet RPC through /wallet/<filename> uri-path).");
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnsureWalletIsUnlocked(const CWallet* pwallet)
|
void EnsureWalletIsUnlocked(const CWallet& wallet)
|
||||||
{
|
{
|
||||||
if (pwallet->IsLocked()) {
|
if (wallet.IsLocked()) {
|
||||||
throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Error: Please enter the wallet passphrase with walletpassphrase first.");
|
throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Error: Please enter the wallet passphrase with walletpassphrase first.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -393,13 +393,13 @@ void ParseRecipients(const UniValue& address_amounts, const UniValue& subtract_f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue SendMoney(CWallet* const pwallet, const CCoinControl &coin_control, std::vector<CRecipient> &recipients, mapValue_t map_value, bool verbose)
|
UniValue SendMoney(CWallet& wallet, const CCoinControl &coin_control, std::vector<CRecipient> &recipients, mapValue_t map_value, bool verbose)
|
||||||
{
|
{
|
||||||
EnsureWalletIsUnlocked(pwallet);
|
EnsureWalletIsUnlocked(wallet);
|
||||||
|
|
||||||
// This function is only used by sendtoaddress and sendmany.
|
// This function is only used by sendtoaddress and sendmany.
|
||||||
// This should always try to sign, if we don't have private keys, don't try to do anything here.
|
// This should always try to sign, if we don't have private keys, don't try to do anything here.
|
||||||
if (pwallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
if (wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS)) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Error: Private keys are disabled for this wallet");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error: Private keys are disabled for this wallet");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,11 +412,11 @@ UniValue SendMoney(CWallet* const pwallet, const CCoinControl &coin_control, std
|
||||||
bilingual_str error;
|
bilingual_str error;
|
||||||
CTransactionRef tx;
|
CTransactionRef tx;
|
||||||
FeeCalculation fee_calc_out;
|
FeeCalculation fee_calc_out;
|
||||||
const bool fCreated = pwallet->CreateTransaction(recipients, tx, nFeeRequired, nChangePosRet, error, coin_control, fee_calc_out, true);
|
const bool fCreated = wallet.CreateTransaction(recipients, tx, nFeeRequired, nChangePosRet, error, coin_control, fee_calc_out, true);
|
||||||
if (!fCreated) {
|
if (!fCreated) {
|
||||||
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, error.original);
|
throw JSONRPCError(RPC_WALLET_INSUFFICIENT_FUNDS, error.original);
|
||||||
}
|
}
|
||||||
pwallet->CommitTransaction(tx, std::move(map_value), {} /* orderForm */);
|
wallet.CommitTransaction(tx, std::move(map_value), {} /* orderForm */);
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
UniValue entry(UniValue::VOBJ);
|
UniValue entry(UniValue::VOBJ);
|
||||||
entry.pushKV("txid", tx->GetHash().GetHex());
|
entry.pushKV("txid", tx->GetHash().GetHex());
|
||||||
|
@ -503,13 +503,13 @@ static RPCHelpMan sendtoaddress()
|
||||||
coin_control.m_signal_bip125_rbf = request.params[5].get_bool();
|
coin_control.m_signal_bip125_rbf = request.params[5].get_bool();
|
||||||
}
|
}
|
||||||
|
|
||||||
coin_control.m_avoid_address_reuse = GetAvoidReuseFlag(pwallet.get(), request.params[8]);
|
coin_control.m_avoid_address_reuse = GetAvoidReuseFlag(*pwallet, request.params[8]);
|
||||||
// We also enable partial spend avoidance if reuse avoidance is set.
|
// We also enable partial spend avoidance if reuse avoidance is set.
|
||||||
coin_control.m_avoid_partial_spends |= coin_control.m_avoid_address_reuse;
|
coin_control.m_avoid_partial_spends |= coin_control.m_avoid_address_reuse;
|
||||||
|
|
||||||
SetFeeEstimateMode(*pwallet, coin_control, /* conf_target */ request.params[6], /* estimate_mode */ request.params[7], /* fee_rate */ request.params[9], /* override_min_fee */ false);
|
SetFeeEstimateMode(*pwallet, coin_control, /* conf_target */ request.params[6], /* estimate_mode */ request.params[7], /* fee_rate */ request.params[9], /* override_min_fee */ false);
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
UniValue address_amounts(UniValue::VOBJ);
|
UniValue address_amounts(UniValue::VOBJ);
|
||||||
const std::string address = request.params[0].get_str();
|
const std::string address = request.params[0].get_str();
|
||||||
|
@ -523,7 +523,7 @@ static RPCHelpMan sendtoaddress()
|
||||||
ParseRecipients(address_amounts, subtractFeeFromAmount, recipients);
|
ParseRecipients(address_amounts, subtractFeeFromAmount, recipients);
|
||||||
const bool verbose{request.params[10].isNull() ? false : request.params[10].get_bool()};
|
const bool verbose{request.params[10].isNull() ? false : request.params[10].get_bool()};
|
||||||
|
|
||||||
return SendMoney(pwallet.get(), coin_control, recipients, mapValue, verbose);
|
return SendMoney(*pwallet, coin_control, recipients, mapValue, verbose);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -617,7 +617,7 @@ static RPCHelpMan signmessage()
|
||||||
|
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
std::string strAddress = request.params[0].get_str();
|
std::string strAddress = request.params[0].get_str();
|
||||||
std::string strMessage = request.params[1].get_str();
|
std::string strMessage = request.params[1].get_str();
|
||||||
|
@ -813,7 +813,7 @@ static RPCHelpMan getbalance()
|
||||||
|
|
||||||
bool include_watchonly = ParseIncludeWatchonly(request.params[2], *pwallet);
|
bool include_watchonly = ParseIncludeWatchonly(request.params[2], *pwallet);
|
||||||
|
|
||||||
bool avoid_reuse = GetAvoidReuseFlag(pwallet.get(), request.params[3]);
|
bool avoid_reuse = GetAvoidReuseFlag(*pwallet, request.params[3]);
|
||||||
|
|
||||||
const auto bal = pwallet->GetBalance(min_depth, avoid_reuse);
|
const auto bal = pwallet->GetBalance(min_depth, avoid_reuse);
|
||||||
|
|
||||||
|
@ -934,7 +934,7 @@ static RPCHelpMan sendmany()
|
||||||
ParseRecipients(sendTo, subtractFeeFromAmount, recipients);
|
ParseRecipients(sendTo, subtractFeeFromAmount, recipients);
|
||||||
const bool verbose{request.params[9].isNull() ? false : request.params[9].get_bool()};
|
const bool verbose{request.params[9].isNull() ? false : request.params[9].get_bool()};
|
||||||
|
|
||||||
return SendMoney(pwallet.get(), coin_control, recipients, std::move(mapValue), verbose);
|
return SendMoney(*pwallet, coin_control, recipients, std::move(mapValue), verbose);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1033,7 +1033,7 @@ struct tallyitem
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static UniValue ListReceived(const CWallet* const pwallet, const UniValue& params, bool by_label) EXCLUSIVE_LOCKS_REQUIRED(pwallet->cs_wallet)
|
static UniValue ListReceived(const CWallet& wallet, const UniValue& params, bool by_label) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
|
||||||
{
|
{
|
||||||
// Minimum confirmations
|
// Minimum confirmations
|
||||||
int nMinDepth = 1;
|
int nMinDepth = 1;
|
||||||
|
@ -1047,7 +1047,7 @@ static UniValue ListReceived(const CWallet* const pwallet, const UniValue& param
|
||||||
|
|
||||||
isminefilter filter = ISMINE_SPENDABLE;
|
isminefilter filter = ISMINE_SPENDABLE;
|
||||||
|
|
||||||
if (ParseIncludeWatchonly(params[2], *pwallet)) {
|
if (ParseIncludeWatchonly(params[2], wallet)) {
|
||||||
filter |= ISMINE_WATCH_ONLY;
|
filter |= ISMINE_WATCH_ONLY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1063,10 +1063,10 @@ static UniValue ListReceived(const CWallet* const pwallet, const UniValue& param
|
||||||
|
|
||||||
// Tally
|
// Tally
|
||||||
std::map<CTxDestination, tallyitem> mapTally;
|
std::map<CTxDestination, tallyitem> mapTally;
|
||||||
for (const std::pair<const uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
|
for (const std::pair<const uint256, CWalletTx>& pairWtx : wallet.mapWallet) {
|
||||||
const CWalletTx& wtx = pairWtx.second;
|
const CWalletTx& wtx = pairWtx.second;
|
||||||
|
|
||||||
if (wtx.IsCoinBase() || !pwallet->chain().checkFinalTx(*wtx.tx)) {
|
if (wtx.IsCoinBase() || !wallet.chain().checkFinalTx(*wtx.tx)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1084,7 +1084,7 @@ static UniValue ListReceived(const CWallet* const pwallet, const UniValue& param
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
isminefilter mine = pwallet->IsMine(address);
|
isminefilter mine = wallet.IsMine(address);
|
||||||
if(!(mine & filter))
|
if(!(mine & filter))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -1103,11 +1103,11 @@ static UniValue ListReceived(const CWallet* const pwallet, const UniValue& param
|
||||||
|
|
||||||
// Create m_address_book iterator
|
// Create m_address_book iterator
|
||||||
// If we aren't filtering, go from begin() to end()
|
// If we aren't filtering, go from begin() to end()
|
||||||
auto start = pwallet->m_address_book.begin();
|
auto start = wallet.m_address_book.begin();
|
||||||
auto end = pwallet->m_address_book.end();
|
auto end = wallet.m_address_book.end();
|
||||||
// If we are filtering, find() the applicable entry
|
// If we are filtering, find() the applicable entry
|
||||||
if (has_filtered_address) {
|
if (has_filtered_address) {
|
||||||
start = pwallet->m_address_book.find(filtered_address);
|
start = wallet.m_address_book.find(filtered_address);
|
||||||
if (start != end) {
|
if (start != end) {
|
||||||
end = std::next(start);
|
end = std::next(start);
|
||||||
}
|
}
|
||||||
|
@ -1224,7 +1224,7 @@ static RPCHelpMan listreceivedbyaddress()
|
||||||
|
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
|
|
||||||
return ListReceived(pwallet.get(), request.params, false);
|
return ListReceived(*pwallet, request.params, false);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1266,7 +1266,7 @@ static RPCHelpMan listreceivedbylabel()
|
||||||
|
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
|
|
||||||
return ListReceived(pwallet.get(), request.params, true);
|
return ListReceived(*pwallet, request.params, true);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1289,7 +1289,7 @@ static void MaybePushAddress(UniValue & entry, const CTxDestination &dest)
|
||||||
* @param filter_ismine The "is mine" filter flags.
|
* @param filter_ismine The "is mine" filter flags.
|
||||||
* @param filter_label Optional label string to filter incoming transactions.
|
* @param filter_label Optional label string to filter incoming transactions.
|
||||||
*/
|
*/
|
||||||
static void ListTransactions(const CWallet* const pwallet, const CWalletTx& wtx, int nMinDepth, bool fLong, UniValue& ret, const isminefilter& filter_ismine, const std::string* filter_label) EXCLUSIVE_LOCKS_REQUIRED(pwallet->cs_wallet)
|
static void ListTransactions(const CWallet& wallet, const CWalletTx& wtx, int nMinDepth, bool fLong, UniValue& ret, const isminefilter& filter_ismine, const std::string* filter_label) EXCLUSIVE_LOCKS_REQUIRED(wallet.cs_wallet)
|
||||||
{
|
{
|
||||||
CAmount nFee;
|
CAmount nFee;
|
||||||
std::list<COutputEntry> listReceived;
|
std::list<COutputEntry> listReceived;
|
||||||
|
@ -1305,20 +1305,20 @@ static void ListTransactions(const CWallet* const pwallet, const CWalletTx& wtx,
|
||||||
for (const COutputEntry& s : listSent)
|
for (const COutputEntry& s : listSent)
|
||||||
{
|
{
|
||||||
UniValue entry(UniValue::VOBJ);
|
UniValue entry(UniValue::VOBJ);
|
||||||
if (involvesWatchonly || (pwallet->IsMine(s.destination) & ISMINE_WATCH_ONLY)) {
|
if (involvesWatchonly || (wallet.IsMine(s.destination) & ISMINE_WATCH_ONLY)) {
|
||||||
entry.pushKV("involvesWatchonly", true);
|
entry.pushKV("involvesWatchonly", true);
|
||||||
}
|
}
|
||||||
MaybePushAddress(entry, s.destination);
|
MaybePushAddress(entry, s.destination);
|
||||||
entry.pushKV("category", "send");
|
entry.pushKV("category", "send");
|
||||||
entry.pushKV("amount", ValueFromAmount(-s.amount));
|
entry.pushKV("amount", ValueFromAmount(-s.amount));
|
||||||
const auto* address_book_entry = pwallet->FindAddressBookEntry(s.destination);
|
const auto* address_book_entry = wallet.FindAddressBookEntry(s.destination);
|
||||||
if (address_book_entry) {
|
if (address_book_entry) {
|
||||||
entry.pushKV("label", address_book_entry->GetLabel());
|
entry.pushKV("label", address_book_entry->GetLabel());
|
||||||
}
|
}
|
||||||
entry.pushKV("vout", s.vout);
|
entry.pushKV("vout", s.vout);
|
||||||
entry.pushKV("fee", ValueFromAmount(-nFee));
|
entry.pushKV("fee", ValueFromAmount(-nFee));
|
||||||
if (fLong)
|
if (fLong)
|
||||||
WalletTxToJSON(pwallet->chain(), wtx, entry);
|
WalletTxToJSON(wallet.chain(), wtx, entry);
|
||||||
entry.pushKV("abandoned", wtx.isAbandoned());
|
entry.pushKV("abandoned", wtx.isAbandoned());
|
||||||
ret.push_back(entry);
|
ret.push_back(entry);
|
||||||
}
|
}
|
||||||
|
@ -1329,7 +1329,7 @@ static void ListTransactions(const CWallet* const pwallet, const CWalletTx& wtx,
|
||||||
for (const COutputEntry& r : listReceived)
|
for (const COutputEntry& r : listReceived)
|
||||||
{
|
{
|
||||||
std::string label;
|
std::string label;
|
||||||
const auto* address_book_entry = pwallet->FindAddressBookEntry(r.destination);
|
const auto* address_book_entry = wallet.FindAddressBookEntry(r.destination);
|
||||||
if (address_book_entry) {
|
if (address_book_entry) {
|
||||||
label = address_book_entry->GetLabel();
|
label = address_book_entry->GetLabel();
|
||||||
}
|
}
|
||||||
|
@ -1337,7 +1337,7 @@ static void ListTransactions(const CWallet* const pwallet, const CWalletTx& wtx,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
UniValue entry(UniValue::VOBJ);
|
UniValue entry(UniValue::VOBJ);
|
||||||
if (involvesWatchonly || (pwallet->IsMine(r.destination) & ISMINE_WATCH_ONLY)) {
|
if (involvesWatchonly || (wallet.IsMine(r.destination) & ISMINE_WATCH_ONLY)) {
|
||||||
entry.pushKV("involvesWatchonly", true);
|
entry.pushKV("involvesWatchonly", true);
|
||||||
}
|
}
|
||||||
MaybePushAddress(entry, r.destination);
|
MaybePushAddress(entry, r.destination);
|
||||||
|
@ -1360,7 +1360,7 @@ static void ListTransactions(const CWallet* const pwallet, const CWalletTx& wtx,
|
||||||
}
|
}
|
||||||
entry.pushKV("vout", r.vout);
|
entry.pushKV("vout", r.vout);
|
||||||
if (fLong)
|
if (fLong)
|
||||||
WalletTxToJSON(pwallet->chain(), wtx, entry);
|
WalletTxToJSON(wallet.chain(), wtx, entry);
|
||||||
ret.push_back(entry);
|
ret.push_back(entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1479,7 +1479,7 @@ static RPCHelpMan listtransactions()
|
||||||
for (CWallet::TxItems::const_reverse_iterator it = txOrdered.rbegin(); it != txOrdered.rend(); ++it)
|
for (CWallet::TxItems::const_reverse_iterator it = txOrdered.rbegin(); it != txOrdered.rend(); ++it)
|
||||||
{
|
{
|
||||||
CWalletTx *const pwtx = (*it).second;
|
CWalletTx *const pwtx = (*it).second;
|
||||||
ListTransactions(pwallet.get(), *pwtx, 0, true, ret, filter, filter_label);
|
ListTransactions(*pwallet, *pwtx, 0, true, ret, filter, filter_label);
|
||||||
if ((int)ret.size() >= (nCount+nFrom)) break;
|
if ((int)ret.size() >= (nCount+nFrom)) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1601,7 +1601,7 @@ static RPCHelpMan listsinceblock()
|
||||||
const CWalletTx& tx = pairWtx.second;
|
const CWalletTx& tx = pairWtx.second;
|
||||||
|
|
||||||
if (depth == -1 || abs(tx.GetDepthInMainChain()) < depth) {
|
if (depth == -1 || abs(tx.GetDepthInMainChain()) < depth) {
|
||||||
ListTransactions(&wallet, tx, 0, true, transactions, filter, nullptr /* filter_label */);
|
ListTransactions(wallet, tx, 0, true, transactions, filter, nullptr /* filter_label */);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1618,7 +1618,7 @@ static RPCHelpMan listsinceblock()
|
||||||
if (it != wallet.mapWallet.end()) {
|
if (it != wallet.mapWallet.end()) {
|
||||||
// We want all transactions regardless of confirmation count to appear here,
|
// We want all transactions regardless of confirmation count to appear here,
|
||||||
// even negative confirmation ones, hence the big negative.
|
// even negative confirmation ones, hence the big negative.
|
||||||
ListTransactions(&wallet, it->second, -100000000, true, removed, filter, nullptr /* filter_label */);
|
ListTransactions(wallet, it->second, -100000000, true, removed, filter, nullptr /* filter_label */);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
blockId = block.hashPrevBlock;
|
blockId = block.hashPrevBlock;
|
||||||
|
@ -1733,7 +1733,7 @@ static RPCHelpMan gettransaction()
|
||||||
WalletTxToJSON(pwallet->chain(), wtx, entry);
|
WalletTxToJSON(pwallet->chain(), wtx, entry);
|
||||||
|
|
||||||
UniValue details(UniValue::VARR);
|
UniValue details(UniValue::VARR);
|
||||||
ListTransactions(pwallet.get(), wtx, 0, false, details, filter, nullptr /* filter_label */);
|
ListTransactions(*pwallet, wtx, 0, false, details, filter, nullptr /* filter_label */);
|
||||||
entry.pushKV("details", details);
|
entry.pushKV("details", details);
|
||||||
|
|
||||||
std::string strHex = EncodeHexTx(*wtx.tx, pwallet->chain().rpcSerializationFlags());
|
std::string strHex = EncodeHexTx(*wtx.tx, pwallet->chain().rpcSerializationFlags());
|
||||||
|
@ -1858,7 +1858,7 @@ static RPCHelpMan keypoolrefill()
|
||||||
kpSize = (unsigned int)request.params[0].get_int();
|
kpSize = (unsigned int)request.params[0].get_int();
|
||||||
}
|
}
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
pwallet->TopUpKeyPool(kpSize);
|
pwallet->TopUpKeyPool(kpSize);
|
||||||
|
|
||||||
if (pwallet->GetKeyPoolSize() < kpSize) {
|
if (pwallet->GetKeyPoolSize() < kpSize) {
|
||||||
|
@ -3052,11 +3052,11 @@ static RPCHelpMan listunspent()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void FundTransaction(CWallet* const pwallet, CMutableTransaction& tx, CAmount& fee_out, int& change_position, const UniValue& options, CCoinControl& coinControl, bool override_min_fee)
|
void FundTransaction(CWallet& wallet, CMutableTransaction& tx, CAmount& fee_out, int& change_position, const UniValue& options, CCoinControl& coinControl, bool override_min_fee)
|
||||||
{
|
{
|
||||||
// Make sure the results are valid at least up to the most recent block
|
// 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
|
// the user could have gotten from another RPC command prior to now
|
||||||
pwallet->BlockUntilSyncedToCurrentChain();
|
wallet.BlockUntilSyncedToCurrentChain();
|
||||||
|
|
||||||
change_position = -1;
|
change_position = -1;
|
||||||
bool lockUnspents = false;
|
bool lockUnspents = false;
|
||||||
|
@ -3127,7 +3127,7 @@ void FundTransaction(CWallet* const pwallet, CMutableTransaction& tx, CAmount& f
|
||||||
}
|
}
|
||||||
|
|
||||||
const UniValue include_watching_option = options.exists("include_watching") ? options["include_watching"] : options["includeWatching"];
|
const UniValue include_watching_option = options.exists("include_watching") ? options["include_watching"] : options["includeWatching"];
|
||||||
coinControl.fAllowWatchOnly = ParseIncludeWatchonly(include_watching_option, *pwallet);
|
coinControl.fAllowWatchOnly = ParseIncludeWatchonly(include_watching_option, wallet);
|
||||||
|
|
||||||
if (options.exists("lockUnspents") || options.exists("lock_unspents")) {
|
if (options.exists("lockUnspents") || options.exists("lock_unspents")) {
|
||||||
lockUnspents = (options.exists("lock_unspents") ? options["lock_unspents"] : options["lockUnspents"]).get_bool();
|
lockUnspents = (options.exists("lock_unspents") ? options["lock_unspents"] : options["lockUnspents"]).get_bool();
|
||||||
|
@ -3153,11 +3153,11 @@ void FundTransaction(CWallet* const pwallet, CMutableTransaction& tx, CAmount& f
|
||||||
if (options.exists("replaceable")) {
|
if (options.exists("replaceable")) {
|
||||||
coinControl.m_signal_bip125_rbf = options["replaceable"].get_bool();
|
coinControl.m_signal_bip125_rbf = options["replaceable"].get_bool();
|
||||||
}
|
}
|
||||||
SetFeeEstimateMode(*pwallet, coinControl, options["conf_target"], options["estimate_mode"], options["fee_rate"], override_min_fee);
|
SetFeeEstimateMode(wallet, coinControl, options["conf_target"], options["estimate_mode"], options["fee_rate"], override_min_fee);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if options is null and not a bool
|
// if options is null and not a bool
|
||||||
coinControl.fAllowWatchOnly = ParseIncludeWatchonly(NullUniValue, *pwallet);
|
coinControl.fAllowWatchOnly = ParseIncludeWatchonly(NullUniValue, wallet);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tx.vout.size() == 0)
|
if (tx.vout.size() == 0)
|
||||||
|
@ -3179,7 +3179,7 @@ void FundTransaction(CWallet* const pwallet, CMutableTransaction& tx, CAmount& f
|
||||||
|
|
||||||
bilingual_str error;
|
bilingual_str error;
|
||||||
|
|
||||||
if (!pwallet->FundTransaction(tx, fee_out, change_position, error, lockUnspents, setSubtractFeeFromOutputs, coinControl)) {
|
if (!wallet.FundTransaction(tx, fee_out, change_position, error, lockUnspents, setSubtractFeeFromOutputs, coinControl)) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, error.original);
|
throw JSONRPCError(RPC_WALLET_ERROR, error.original);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3273,7 +3273,7 @@ static RPCHelpMan fundrawtransaction()
|
||||||
CCoinControl coin_control;
|
CCoinControl coin_control;
|
||||||
// Automatically select (additional) coins. Can be overridden by options.add_inputs.
|
// Automatically select (additional) coins. Can be overridden by options.add_inputs.
|
||||||
coin_control.m_add_inputs = true;
|
coin_control.m_add_inputs = true;
|
||||||
FundTransaction(pwallet.get(), tx, fee, change_position, request.params[1], coin_control, /* override_min_fee */ true);
|
FundTransaction(*pwallet, tx, fee, change_position, request.params[1], coin_control, /* override_min_fee */ true);
|
||||||
|
|
||||||
UniValue result(UniValue::VOBJ);
|
UniValue result(UniValue::VOBJ);
|
||||||
result.pushKV("hex", EncodeHexTx(CTransaction(tx)));
|
result.pushKV("hex", EncodeHexTx(CTransaction(tx)));
|
||||||
|
@ -3352,7 +3352,7 @@ RPCHelpMan signrawtransactionwithwallet()
|
||||||
|
|
||||||
// Sign the transaction
|
// Sign the transaction
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
// Fetch previous transactions (inputs):
|
// Fetch previous transactions (inputs):
|
||||||
std::map<COutPoint, Coin> coins;
|
std::map<COutPoint, Coin> coins;
|
||||||
|
@ -3483,7 +3483,8 @@ static RPCHelpMan bumpfee_helper(std::string method_name)
|
||||||
pwallet->BlockUntilSyncedToCurrentChain();
|
pwallet->BlockUntilSyncedToCurrentChain();
|
||||||
|
|
||||||
LOCK(pwallet->cs_wallet);
|
LOCK(pwallet->cs_wallet);
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
|
||||||
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
|
|
||||||
std::vector<bilingual_str> errors;
|
std::vector<bilingual_str> errors;
|
||||||
|
@ -3727,15 +3728,13 @@ public:
|
||||||
UniValue operator()(const WitnessUnknown& id) const { return UniValue(UniValue::VOBJ); }
|
UniValue operator()(const WitnessUnknown& id) const { return UniValue(UniValue::VOBJ); }
|
||||||
};
|
};
|
||||||
|
|
||||||
static UniValue DescribeWalletAddress(const CWallet* const pwallet, const CTxDestination& dest)
|
static UniValue DescribeWalletAddress(const CWallet& wallet, const CTxDestination& dest)
|
||||||
{
|
{
|
||||||
UniValue ret(UniValue::VOBJ);
|
UniValue ret(UniValue::VOBJ);
|
||||||
UniValue detail = DescribeAddress(dest);
|
UniValue detail = DescribeAddress(dest);
|
||||||
CScript script = GetScriptForDestination(dest);
|
CScript script = GetScriptForDestination(dest);
|
||||||
std::unique_ptr<SigningProvider> provider = nullptr;
|
std::unique_ptr<SigningProvider> provider = nullptr;
|
||||||
if (pwallet) {
|
provider = wallet.GetSolvingProvider(script);
|
||||||
provider = pwallet->GetSolvingProvider(script);
|
|
||||||
}
|
|
||||||
ret.pushKVs(detail);
|
ret.pushKVs(detail);
|
||||||
ret.pushKVs(std::visit(DescribeWalletAddressVisitor(provider.get()), dest));
|
ret.pushKVs(std::visit(DescribeWalletAddressVisitor(provider.get()), dest));
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -3854,7 +3853,7 @@ RPCHelpMan getaddressinfo()
|
||||||
|
|
||||||
ret.pushKV("iswatchonly", bool(mine & ISMINE_WATCH_ONLY));
|
ret.pushKV("iswatchonly", bool(mine & ISMINE_WATCH_ONLY));
|
||||||
|
|
||||||
UniValue detail = DescribeWalletAddress(pwallet.get(), dest);
|
UniValue detail = DescribeWalletAddress(*pwallet, dest);
|
||||||
ret.pushKVs(detail);
|
ret.pushKVs(detail);
|
||||||
|
|
||||||
ret.pushKV("ischange", pwallet->IsChange(scriptPubKey));
|
ret.pushKV("ischange", pwallet->IsChange(scriptPubKey));
|
||||||
|
@ -4149,7 +4148,7 @@ static RPCHelpMan send()
|
||||||
// Automatically select coins, unless at least one is manually selected. Can
|
// Automatically select coins, unless at least one is manually selected. Can
|
||||||
// be overridden by options.add_inputs.
|
// be overridden by options.add_inputs.
|
||||||
coin_control.m_add_inputs = rawTx.vin.size() == 0;
|
coin_control.m_add_inputs = rawTx.vin.size() == 0;
|
||||||
FundTransaction(pwallet.get(), rawTx, fee, change_position, options, coin_control, /* override_min_fee */ false);
|
FundTransaction(*pwallet, rawTx, fee, change_position, options, coin_control, /* override_min_fee */ false);
|
||||||
|
|
||||||
bool add_to_wallet = true;
|
bool add_to_wallet = true;
|
||||||
if (options.exists("add_to_wallet")) {
|
if (options.exists("add_to_wallet")) {
|
||||||
|
@ -4238,7 +4237,7 @@ static RPCHelpMan sethdseed()
|
||||||
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");
|
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");
|
||||||
}
|
}
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
bool flush_key_pool = true;
|
bool flush_key_pool = true;
|
||||||
if (!request.params[0].isNull()) {
|
if (!request.params[0].isNull()) {
|
||||||
|
@ -4435,7 +4434,7 @@ static RPCHelpMan walletcreatefundedpsbt()
|
||||||
// Automatically select coins, unless at least one is manually selected. Can
|
// Automatically select coins, unless at least one is manually selected. Can
|
||||||
// be overridden by options.add_inputs.
|
// be overridden by options.add_inputs.
|
||||||
coin_control.m_add_inputs = rawTx.vin.size() == 0;
|
coin_control.m_add_inputs = rawTx.vin.size() == 0;
|
||||||
FundTransaction(pwallet.get(), rawTx, fee, change_position, request.params[3], coin_control, /* override_min_fee */ true);
|
FundTransaction(*pwallet, rawTx, fee, change_position, request.params[3], coin_control, /* override_min_fee */ true);
|
||||||
|
|
||||||
// Make a blank psbt
|
// Make a blank psbt
|
||||||
PartiallySignedTransaction psbtx(rawTx);
|
PartiallySignedTransaction psbtx(rawTx);
|
||||||
|
@ -4490,7 +4489,7 @@ static RPCHelpMan upgradewallet()
|
||||||
|
|
||||||
RPCTypeCheck(request.params, {UniValue::VNUM}, true);
|
RPCTypeCheck(request.params, {UniValue::VNUM}, true);
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(pwallet.get());
|
EnsureWalletIsUnlocked(*pwallet);
|
||||||
|
|
||||||
int version = 0;
|
int version = 0;
|
||||||
if (!request.params[0].isNull()) {
|
if (!request.params[0].isNull()) {
|
||||||
|
|
|
@ -30,7 +30,7 @@ Span<const CRPCCommand> GetWalletRPCCommands();
|
||||||
*/
|
*/
|
||||||
std::shared_ptr<CWallet> GetWalletForJSONRPCRequest(const JSONRPCRequest& request);
|
std::shared_ptr<CWallet> GetWalletForJSONRPCRequest(const JSONRPCRequest& request);
|
||||||
|
|
||||||
void EnsureWalletIsUnlocked(const CWallet*);
|
void EnsureWalletIsUnlocked(const CWallet&);
|
||||||
WalletContext& EnsureWalletContext(const util::Ref& context);
|
WalletContext& EnsureWalletContext(const util::Ref& context);
|
||||||
LegacyScriptPubKeyMan& EnsureLegacyScriptPubKeyMan(CWallet& wallet, bool also_create = false);
|
LegacyScriptPubKeyMan& EnsureLegacyScriptPubKeyMan(CWallet& wallet, bool also_create = false);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue