34 std::vector<CRecipient>
CreateRecipients(
const std::vector<std::pair<CTxDestination, CAmount>>& outputs,
const std::set<int>& subtract_fee_outputs)
36 std::vector<CRecipient> recipients;
37 for (
size_t i = 0; i < outputs.size(); ++i) {
38 const auto& [destination, amount] = outputs.at(i);
39 CRecipient recipient{destination, amount, subtract_fee_outputs.contains(i)};
40 recipients.push_back(recipient);
47 if (options.
exists(
"conf_target") || options.
exists(
"estimate_mode")) {
52 options.
pushKV(
"conf_target", conf_target);
53 options.
pushKV(
"estimate_mode", estimate_mode);
55 if (options.
exists(
"fee_rate")) {
60 options.
pushKV(
"fee_rate", fee_rate);
62 if (!options[
"conf_target"].isNull() && (options[
"estimate_mode"].isNull() || (options[
"estimate_mode"].get_str() ==
"unset"))) {
69 std::set<int> sffo_set;
70 if (sffo_instructions.
isNull())
return sffo_set;
72 for (
const auto& sffo : sffo_instructions.
getValues()) {
75 auto it = find(destinations.begin(), destinations.end(), sffo.get_str());
77 pos = it - destinations.begin();
78 }
else if (sffo.isNum()) {
84 if (sffo_set.contains(pos))
88 if (pos >=
int(destinations.size()))
104 const auto err{pwallet->FillPSBT(psbtx, complete,
SIGHASH_DEFAULT,
true,
false)};
114 const bool psbt_opt_in{options.
exists(
"psbt") && options[
"psbt"].
get_bool()};
115 bool add_to_wallet{options.
exists(
"add_to_wallet") ? options[
"add_to_wallet"].
get_bool() :
true};
116 if (psbt_opt_in || !complete || !add_to_wallet) {
126 result.pushKV(
"txid", tx->GetHash().GetHex());
127 if (add_to_wallet && !psbt_opt_in) {
128 pwallet->CommitTransaction(tx, {}, {});
130 result.pushKV(
"hex", hex);
133 result.pushKV(
"complete", complete);
140 if (options.
exists(
"feeRate")) {
143 if (options.
exists(
"changeAddress")) {
146 if (options.
exists(
"changePosition")) {
149 if (options.
exists(
"includeWatching")) {
152 if (options.
exists(
"lockUnspents")) {
155 if (options.
exists(
"subtractFeeFromOutputs")) {
179 wallet.CommitTransaction(tx, std::move(map_value), {});
182 entry.
pushKV(
"txid", tx->GetHash().GetHex());
186 return tx->GetHash().GetHex();
206 if (!conf_target.
isNull()) {
207 throw JSONRPCError(
RPC_INVALID_PARAMETER,
"Cannot specify both conf_target and fee_rate. Please provide either a confirmation target in blocks for automatic fee estimation, or an explicit fee rate.");
209 if (!estimate_mode.
isNull() && estimate_mode.
get_str() !=
"unset") {
222 if (!conf_target.
isNull()) {
230 "\nSend an amount to a given address." +
236 "This is not part of the transaction, just kept in your wallet."},
238 "to which you're sending the transaction. This is not part of the \n" 239 "transaction, just kept in your wallet."},
241 "The recipient will receive less bitcoins than you enter in the amount field."},
245 +
FeeModesDetail(std::string(
"economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used"))},
246 {
"avoid_reuse",
RPCArg::Type::BOOL,
RPCArg::Default{
true},
"(only available if avoid_reuse wallet flag is set) Avoid spending from dirty addresses; addresses are considered\n" 247 "dirty if they have previously been used in a transaction. If true, this also activates avoidpartialspends, grouping outputs by their addresses."},
252 RPCResult{
"if verbose is not set or set to false",
266 "\nSend 0.1 BTC with a confirmation target of 6 blocks in economical fee estimate mode using positional arguments\n" 268 "\nSend 0.1 BTC with a fee rate of 1.1 " +
CURRENCY_ATOM +
"/vB, subtract fee from amount, BIP125-replaceable, using positional arguments\n" 270 "\nSend 0.2 BTC with a confirmation target of 6 blocks in economical fee estimate mode using named arguments\n" 272 "\nSend 0.5 BTC with a fee rate of 25 " +
CURRENCY_ATOM +
"/vB using named arguments\n" 274 +
HelpExampleCli(
"-named sendtoaddress",
"address=\"" +
EXAMPLE_ADDRESS[0] +
"\" amount=0.5 fee_rate=25 subtractfeefromamount=false replaceable=true avoid_reuse=true comment=\"2 pizzas\" comment_to=\"jeremy\" verbose=true")
283 pwallet->BlockUntilSyncedToCurrentChain();
285 LOCK(pwallet->cs_wallet);
289 if (!request.params[2].isNull() && !request.params[2].get_str().empty())
290 mapValue[
"comment"] = request.params[2].get_str();
291 if (!request.params[3].isNull() && !request.params[3].get_str().empty())
292 mapValue[
"to"] = request.params[3].get_str();
295 if (!request.params[5].isNull()) {
303 SetFeeEstimateMode(*pwallet, coin_control, request.params[6], request.params[7], request.params[9],
false);
308 const std::string address = request.params[0].get_str();
309 address_amounts.
pushKV(address, request.params[1]);
311 std::set<int> sffo_set;
312 if (!request.params[4].isNull() && request.params[4].get_bool()) {
317 const bool verbose{request.params[10].isNull() ? false : request.params[10].get_bool()};
319 return SendMoney(*pwallet, coin_control, recipients, mapValue, verbose);
327 "Send multiple times. Amounts are double-precision floating point numbers." +
342 "The fee will be equally deducted from the amount of each selected address.\n" 343 "Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n" 344 "If no addresses are specified here, the sender pays the fee.",
352 +
FeeModesDetail(std::string(
"economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used"))},
357 RPCResult{
"if verbose is not set or set to false",
359 "the number of addresses." 365 "the number of addresses."},
371 "\nSend two amounts to two different addresses:\n" 373 "\nSend two amounts to two different addresses setting the confirmation and comment:\n" 375 "\nSend two amounts to two different addresses, subtract fee from amount:\n" 377 "\nAs a JSON-RPC call\n" 387 pwallet->BlockUntilSyncedToCurrentChain();
389 LOCK(pwallet->cs_wallet);
391 if (!request.params[0].isNull() && !request.params[0].get_str().empty()) {
397 if (!request.params[3].isNull() && !request.params[3].get_str().empty())
398 mapValue[
"comment"] = request.params[3].
get_str();
401 if (!request.params[5].isNull()) {
405 SetFeeEstimateMode(*pwallet, coin_control, request.params[6], request.params[7], request.params[8],
false);
411 const bool verbose{request.params[9].isNull() ? false : request.params[9].get_bool()};
413 return SendMoney(*pwallet, coin_control, recipients, std::move(mapValue), verbose);
421 "\nSet the transaction fee rate in " +
CURRENCY_UNIT +
"/kvB for this wallet. Overrides the global -paytxfee command line parameter.\n" 422 "Can be deactivated by passing 0 as the fee. In that case automatic fee selection will be used by default.\n",
438 LOCK(pwallet->cs_wallet);
441 CFeeRate tx_fee_rate(nAmount, 1000);
442 CFeeRate max_tx_fee_rate(pwallet->m_default_max_tx_fee, 1000);
445 }
else if (tx_fee_rate < pwallet->chain().relayMinFee()) {
447 }
else if (tx_fee_rate < pwallet->m_min_fee) {
449 }
else if (tx_fee_rate > max_tx_fee_rate) {
453 pwallet->m_pay_tx_fee = tx_fee_rate;
461 static std::vector<RPCArg>
FundTxDoc(
bool solving_data =
true)
463 std::vector<RPCArg>
args = {
469 "Allows this transaction to be replaced by a transaction with higher fees" 474 "Used for fee estimation during coin selection.",
507 wallet.BlockUntilSyncedToCurrentChain();
509 std::optional<unsigned int> change_position;
510 bool lockUnspents =
false;
549 if (options.
exists(
"add_inputs")) {
553 if (options.
exists(
"changeAddress") || options.
exists(
"change_address")) {
554 const std::string change_address_str = (options.
exists(
"change_address") ? options[
"change_address"] : options[
"changeAddress"]).get_str();
564 if (options.
exists(
"changePosition") || options.
exists(
"change_position")) {
565 int pos = (options.
exists(
"change_position") ? options[
"change_position"] : options[
"changePosition"]).getInt<int>();
566 if (pos < 0 || (
unsigned int)pos > recipients.size()) {
569 change_position = (
unsigned int)pos;
572 if (options.
exists(
"change_type")) {
573 if (options.
exists(
"changeAddress") || options.
exists(
"change_address")) {
576 if (std::optional<OutputType> parsed =
ParseOutputType(options[
"change_type"].get_str())) {
583 const UniValue include_watching_option = options.
exists(
"include_watching") ? options[
"include_watching"] : options[
"includeWatching"];
586 if (options.
exists(
"lockUnspents") || options.
exists(
"lock_unspents")) {
587 lockUnspents = (options.
exists(
"lock_unspents") ? options[
"lock_unspents"] : options[
"lockUnspents"]).get_bool();
590 if (options.
exists(
"include_unsafe")) {
594 if (options.
exists(
"feeRate")) {
595 if (options.
exists(
"fee_rate")) {
598 if (options.
exists(
"conf_target")) {
599 throw JSONRPCError(
RPC_INVALID_PARAMETER,
"Cannot specify both conf_target and feeRate. Please provide either a confirmation target in blocks for automatic fee estimation, or an explicit fee rate.");
601 if (options.
exists(
"estimate_mode")) {
608 if (options.
exists(
"replaceable")) {
612 if (options.
exists(
"minconf")) {
620 if (options.
exists(
"maxconf")) {
627 SetFeeEstimateMode(
wallet, coinControl, options[
"conf_target"], options[
"estimate_mode"], options[
"fee_rate"], override_min_fee);
634 if (options.
exists(
"solving_data")) {
636 if (solving_data.
exists(
"pubkeys")) {
637 for (
const UniValue& pk_univ : solving_data[
"pubkeys"].get_array().
getValues()) {
646 if (solving_data.
exists(
"scripts")) {
647 for (
const UniValue& script_univ : solving_data[
"scripts"].get_array().
getValues()) {
648 const std::string& script_str = script_univ.get_str();
649 if (!
IsHex(script_str)) {
652 std::vector<unsigned char> script_data(
ParseHex(script_str));
653 const CScript script(script_data.begin(), script_data.end());
658 if (solving_data.
exists(
"descriptors")) {
659 for (
const UniValue& desc_univ : solving_data[
"descriptors"].get_array().
getValues()) {
660 const std::string& desc_str = desc_univ.get_str();
663 std::vector<CScript> scripts_temp;
664 auto descs =
Parse(desc_str, desc_out, error,
true);
668 for (
auto& desc : descs) {
669 desc->Expand(0, desc_out, scripts_temp, desc_out);
676 if (options.
exists(
"input_weights")) {
681 if (!vout_v.
isNum()) {
684 int vout = vout_v.
getInt<
int>();
690 if (!weight_v.
isNum()) {
693 int64_t weight = weight_v.
getInt<int64_t>();
696 if (weight < min_input_weight) {
697 throw JSONRPCError(
RPC_INVALID_PARAMETER,
"Invalid parameter, weight cannot be less than 165 (41 bytes (size of outpoint + sequence + empty scriptSig) * 4 (witness scaling factor)) + 1 (empty witness)");
707 if (options.
exists(
"max_tx_weight")) {
711 if (recipients.empty())
723 if (options.
exists(
"input_weights")) {
726 if (inputs.
size() == 0) {
731 if (input.exists(
"weight")) {
735 options.
pushKV(
"input_weights", std::move(weights));
741 "\nIf the transaction has no inputs, they will be automatically selected to meet its out value.\n" 742 "It will add at most one change output to the outputs.\n" 743 "No existing outputs will be modified unless \"subtractFeeFromOutputs\" is specified.\n" 744 "Note that inputs which were signed may need to be resigned after completion since in/outputs have been added.\n" 745 "The inputs added will not be signed, use signrawtransactionwithkey\n" 746 "or signrawtransactionwithwallet for that.\n" 747 "All existing inputs must either have their previous output transaction be in the wallet\n" 748 "or be in the UTXO set. Solving data must be provided for non-wallet inputs.\n" 749 "Note that all inputs selected must be of standard form and P2SH scripts must be\n" 750 "in the wallet using importaddress or addmultisigaddress (to calculate fees).\n" 751 "You can see whether this is the case by checking the \"solvable\" field in the listunspent output.\n" 752 "Only pay-to-pubkey, multisig, and P2SH versions thereof are currently supported for watch-only.\n" 753 "Note that if specifying an exact fee rate, the resulting transaction may have a higher fee rate\n" 754 "if the transaction has unconfirmed inputs. This is because the wallet will attempt to make the\n" 755 "entire package have the given fee rate, not the resulting transaction.\n",
759 Cat<std::vector<RPCArg>>(
762 {
"include_unsafe",
RPCArg::Type::BOOL,
RPCArg::Default{
false},
"Include inputs that are not safe to spend (unconfirmed transactions from outside keys and unconfirmed replacement transactions).\n" 763 "Warning: the resulting transaction may become invalid if one of the unsafe inputs disappears.\n" 764 "If that happens, you will need to fund the transaction with different inputs and republish it."},
769 {
"change_type",
RPCArg::Type::STR,
RPCArg::DefaultHint{
"set by -changetype"},
"The output type to use. Only valid if changeAddress is not specified. Options are \"legacy\", \"p2sh-segwit\", \"bech32\", and \"bech32m\"."},
771 "Only solvable inputs can be used. Watch-only destinations are solvable if the public key and/or output script was imported,\n" 772 "e.g. with 'importpubkey' or 'importmulti' with the 'pubkeys' or 'desc' field."},
777 "The fee will be equally deducted from the amount of each specified output.\n" 778 "Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n" 779 "If no outputs are specified here, the sender pays the fee.",
791 "including the weight of the outpoint and sequence number. " 792 "Note that serialized signature sizes are not guaranteed to be consistent, " 793 "so the maximum DER signatures size of 73 bytes should be used when considering ECDSA signatures." 794 "Remember to convert serialized sizes to weight units when necessary."},
800 "Transaction building will fail if this can not be satisfied."},
805 .oneline_description =
"options",
808 "If iswitness is not present, heuristic tests will be used in decoding.\n" 809 "If true, only witness deserialization will be tried.\n" 810 "If false, only non-witness deserialization will be tried.\n" 811 "This boolean should reflect whether the transaction has inputs\n" 812 "(e.g. fully valid, or on-chain transactions), if known by the caller." 824 "\nCreate a transaction with no inputs\n" 825 +
HelpExampleCli(
"createrawtransaction",
"\"[]\" \"{\\\"myaddress\\\":0.01}\"") +
826 "\nAdd sufficient unsigned inputs to meet the output value\n" 828 "\nSign the transaction\n" 829 +
HelpExampleCli(
"signrawtransactionwithwallet",
"\"fundedtransactionhex\"") +
830 "\nSend the transaction\n" 831 +
HelpExampleCli(
"sendrawtransaction",
"\"signedtransactionhex\"")
840 bool try_witness = request.params[2].isNull() ? true : request.params[2].get_bool();
841 bool try_no_witness = request.params[2].isNull() ? true : !request.params[2].get_bool();
842 if (!
DecodeHexTx(tx, request.params[0].get_str(), try_no_witness, try_witness)) {
845 UniValue options = request.params[1];
846 std::vector<std::pair<CTxDestination, CAmount>> destinations;
847 for (
const auto& tx_out : tx.
vout) {
850 destinations.emplace_back(dest, tx_out.nValue);
852 std::vector<std::string> dummy(destinations.size(),
"dummy");
863 auto txr =
FundTransaction(*pwallet, tx, recipients, options, coin_control,
true);
868 result.pushKV(
"changepos", txr.change_pos ? (
int)*txr.change_pos : -1);
877 return RPCHelpMan{
"signrawtransactionwithwallet",
878 "\nSign inputs for raw transaction (serialized, hex-encoded).\n" 879 "The second optional argument (may be null) is an array of previous transaction outputs that\n" 880 "this transaction depends on but may not yet be in the block chain." +
903 " \"ALL|ANYONECANPAY\"\n" 904 " \"NONE|ANYONECANPAY\"\n" 905 " \"SINGLE|ANYONECANPAY\""},
939 if (!
DecodeHexTx(mtx, request.params[0].get_str())) {
944 LOCK(pwallet->cs_wallet);
948 std::map<COutPoint, Coin> coins;
952 pwallet->chain().findCoins(coins);
960 std::map<int, bilingual_str> input_errors;
962 bool complete = pwallet->SignTransaction(mtx, coins, nHashType, input_errors);
979 "the value (float or string) is the amount in " +
CURRENCY_UNIT +
""},
992 const bool want_psbt = method_name ==
"psbtbumpfee";
996 "\nBumps the fee of an opt-in-RBF transaction T, replacing it with a new transaction B.\n" 997 + std::string(want_psbt ?
"Returns a PSBT instead of creating and signing a new transaction.\n" :
"") +
998 "An opt-in RBF transaction with the given txid must be in the wallet.\n" 999 "The command will pay the additional fee by reducing change outputs or adding inputs when necessary.\n" 1000 "It may add a new change output if one does not already exist.\n" 1001 "All inputs in the original transaction will be included in the replacement transaction.\n" 1002 "The command will fail if the wallet or mempool contains a transaction that spends one of T's outputs.\n" 1003 "By default, the new fee will be calculated automatically using the estimatesmartfee RPC.\n" 1004 "The user can specify a confirmation target for estimatesmartfee.\n" 1005 "Alternatively, the user can specify a fee rate in " +
CURRENCY_ATOM +
"/vB for the new transaction.\n" 1006 "At a minimum, the new fee rate must be high enough to pay an additional new relay fee (incrementalfee\n" 1007 "returned by getnetworkinfo) to enter the node's mempool.\n" 1008 "* WARNING: before version 0.21, fee_rate was in " +
CURRENCY_UNIT +
"/kvB. As of 0.21, fee_rate is in " +
CURRENCY_ATOM +
"/vB. *\n",
1015 "\nSpecify a fee rate in " +
CURRENCY_ATOM +
"/vB instead of relying on the built-in fee estimator.\n" 1016 "Must be at least " + incremental_fee +
" higher than the current transaction fee rate.\n" 1017 "WARNING: before version 0.21, fee_rate was in " +
CURRENCY_UNIT +
"/kvB. As of 0.21, fee_rate is in " +
CURRENCY_ATOM +
"/vB.\n"},
1019 "marked bip-125 replaceable. If true, the sequence numbers in the transaction will\n" 1020 "be left unchanged from the original. If false, any input sequence numbers in the\n" 1021 "original transaction that were less than 0xfffffffe will be increased to 0xfffffffe\n" 1022 "so the new transaction will not be explicitly bip-125 replaceable (though it may\n" 1023 "still be replaceable in practice, for example if it has unconfirmed ancestors which\n" 1024 "are replaceable).\n"},
1026 +
FeeModesDetail(std::string(
"economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used"))},
1028 "Each key may only appear once, i.e. there can only be one 'data' output, and no address may be duplicated.\n" 1029 "At least one output of either type must be specified.\n" 1030 "Cannot be provided if 'original_change_index' is specified.",
1033 {
"original_change_index",
RPCArg::Type::NUM,
RPCArg::DefaultHint{
"not set, detect change automatically"},
"The 0-based index of the change output on the original transaction. " 1034 "The indicated output will be recycled into the new change output on the bumped transaction. " 1035 "The remainder after paying the recipients and fees will be sent to the output script of the " 1036 "original change output. The change output’s amount can increase if bumping the transaction " 1037 "adds new inputs, otherwise it will decrease. Cannot be used in combination with the 'outputs' option."},
1044 std::vector<RPCResult>{{
RPCResult::Type::STR,
"psbt",
"The base64-encoded unsigned PSBT of the new transaction."}} :
1056 "\nBump the fee, get the new transaction\'s " + std::string(want_psbt ?
"psbt" :
"txid") +
"\n" +
1065 throw JSONRPCError(
RPC_WALLET_ERROR,
"bumpfee is not available with wallets that have private keys disabled. Use psbtbumpfee instead.");
1074 std::vector<CTxOut> outputs;
1076 std::optional<uint32_t> original_change_index;
1078 if (!request.params[1].isNull()) {
1079 UniValue options = request.params[1];
1092 if (options.
exists(
"confTarget") && options.
exists(
"conf_target")) {
1096 auto conf_target = options.
exists(
"confTarget") ? options[
"confTarget"] : options[
"conf_target"];
1098 if (options.
exists(
"replaceable")) {
1101 SetFeeEstimateMode(*pwallet, coin_control, conf_target, options[
"estimate_mode"], options[
"fee_rate"],
false);
1104 if (!options[
"outputs"].isNull()) {
1105 if (options[
"outputs"].isArray() && options[
"outputs"].empty()) {
1110 outputs = tempTx.
vout;
1113 if (options.
exists(
"original_change_index")) {
1114 original_change_index = options[
"original_change_index"].
getInt<uint32_t>();
1120 pwallet->BlockUntilSyncedToCurrentChain();
1122 LOCK(pwallet->cs_wallet);
1127 std::vector<bilingual_str> errors;
1174 bool complete =
false;
1175 const auto err{pwallet->FillPSBT(psbtx, complete,
SIGHASH_DEFAULT,
false,
true)};
1187 result_errors.
push_back(error.original);
1189 result.pushKV(
"errors", std::move(result_errors));
1202 "\nEXPERIMENTAL warning: this call may be changed in future releases.\n" 1203 "\nSend a transaction.\n",
1206 "Each key may only appear once, i.e. there can only be one 'data' output, and no address may be duplicated.\n" 1207 "At least one output of either type must be specified.\n" 1208 "For convenience, a dictionary, which holds the key-value pairs directly, is also accepted.",
1213 +
FeeModesDetail(std::string(
"economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used"))},
1216 Cat<std::vector<RPCArg>>(
1218 {
"add_inputs",
RPCArg::Type::BOOL,
RPCArg::DefaultHint{
"false when \"inputs\" are specified, true otherwise"},
"Automatically include coins from the wallet to cover the target amount.\n"},
1219 {
"include_unsafe",
RPCArg::Type::BOOL,
RPCArg::Default{
false},
"Include inputs that are not safe to spend (unconfirmed transactions from outside keys and unconfirmed replacement transactions).\n" 1220 "Warning: the resulting transaction may become invalid if one of the unsafe inputs disappears.\n" 1221 "If that happens, you will need to fund the transaction with different inputs and republish it."},
1224 {
"add_to_wallet",
RPCArg::Type::BOOL,
RPCArg::Default{
true},
"When false, returns a serialized transaction which will not be added to the wallet or broadcast"},
1227 {
"change_type",
RPCArg::Type::STR,
RPCArg::DefaultHint{
"set by -changetype"},
"The output type to use. Only valid if change_address is not specified. Options are \"legacy\", \"p2sh-segwit\", \"bech32\" and \"bech32m\"."},
1230 "Only solvable inputs can be used. Watch-only destinations are solvable if the public key and/or output script was imported,\n" 1231 "e.g. with 'importpubkey' or 'importmulti' with the 'pubkeys' or 'desc' field."},
1239 "including the weight of the outpoint and sequence number. " 1240 "Note that signature sizes are not guaranteed to be consistent, " 1241 "so the maximum DER signatures size of 73 bytes should be used when considering ECDSA signatures." 1242 "Remember to convert serialized sizes to weight units when necessary."},
1250 "The fee will be equally deducted from the amount of each specified output.\n" 1251 "Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n" 1252 "If no outputs are specified here, the sender pays the fee.",
1258 "Transaction building will fail if this can not be satisfied."},
1267 {
RPCResult::Type::STR_HEX,
"txid",
true,
"The transaction id for the send. Only 1 transaction is created regardless of the number of addresses."},
1268 {
RPCResult::Type::STR_HEX,
"hex",
true,
"If add_to_wallet is false, the hex-encoded raw transaction with signature(s)"},
1269 {
RPCResult::Type::STR,
"psbt",
true,
"If more signatures are needed, or if add_to_wallet is false, the base64-encoded (partially) signed transaction"}
1273 "\nSend 0.1 BTC with a confirmation target of 6 blocks in economical fee estimate mode\n" 1275 "Send 0.2 BTC with a fee rate of 1.1 " +
CURRENCY_ATOM +
"/vB using positional arguments\n" 1277 "Send 0.2 BTC with a fee rate of 1 " +
CURRENCY_ATOM +
"/vB using the options argument\n" 1279 "Send 0.3 BTC with a fee rate of 25 " +
CURRENCY_ATOM +
"/vB using named arguments\n" 1281 "Create a transaction that should confirm the next block, with a specific input, and return result without adding to wallet or broadcasting to the network\n" 1282 +
HelpExampleCli(
"send",
"'{\"" +
EXAMPLE_ADDRESS[0] +
"\": 0.1}' 1 economical '{\"add_to_wallet\": false, \"inputs\": [{\"txid\":\"a08e6907dbbd3d809776dbfc5d82e371b764ed838b5655e72f463568df1aadf0\", \"vout\":1}]}'")
1294 bool rbf{options.exists(
"replaceable") ? options[
"replaceable"].get_bool() : pwallet->m_signal_rbf};
1306 if (options.exists(
"max_tx_weight")) {
1307 coin_control.
m_max_tx_weight = options[
"max_tx_weight"].getInt<
int>();
1313 auto txr =
FundTransaction(*pwallet, rawTx, recipients, options, coin_control,
false);
1323 "EXPERIMENTAL warning: this call may be changed in future releases.\n" 1324 "\nSpend the value of all (or specific) confirmed UTXOs and unconfirmed change in the wallet to one or more recipients.\n" 1325 "Unconfirmed inbound UTXOs and locked UTXOs will not be spent. Sendall will respect the avoid_reuse wallet flag.\n" 1326 "If your wallet contains many small inputs, either because it received tiny payments or as a result of accumulating change, consider using `send_max` to exclude inputs that are worth less than the fees needed to spend them.\n",
1329 "Optionally some recipients can be specified with an amount to perform payments, but at least one address must appear without a specified amount.\n",
1341 +
FeeModesDetail(std::string(
"economical mode is used if the transaction is replaceable;\notherwise, conservative mode is used"))},
1345 Cat<std::vector<RPCArg>>(
1350 "Only solvable inputs can be used. Watch-only destinations are solvable if the public key and/or output script was imported,\n" 1351 "e.g. with 'importpubkey' or 'importmulti' with the 'pubkeys' or 'desc' field."},
1366 {
"send_max",
RPCArg::Type::BOOL,
RPCArg::Default{
false},
"When true, only use UTXOs that can pay for their own fees to maximize the output amount. When 'false' (default), no UTXO is left behind. send_max is incompatible with providing specific inputs."},
1379 {
RPCResult::Type::STR_HEX,
"txid",
true,
"The transaction id for the send. Only 1 transaction is created regardless of the number of addresses."},
1380 {
RPCResult::Type::STR_HEX,
"hex",
true,
"If add_to_wallet is false, the hex-encoded raw transaction with signature(s)"},
1381 {
RPCResult::Type::STR,
"psbt",
true,
"If more signatures are needed, or if add_to_wallet is false, the base64-encoded (partially) signed transaction"}
1385 "\nSpend all UTXOs from the wallet with a fee rate of 1Â " +
CURRENCY_ATOM +
"/vB using named arguments\n" 1387 "Spend all UTXOs with a fee rate of 1.1 " +
CURRENCY_ATOM +
"/vB using positional arguments\n" 1389 "Spend all UTXOs split into equal amounts to two addresses with a fee rate of 1.5 " +
CURRENCY_ATOM +
"/vB using the options argument\n" 1391 "Leave dust UTXOs in wallet, spend only UTXOs with positive effective value with a fee rate of 10 " +
CURRENCY_ATOM +
"/vB using the options argument\n" 1393 "Spend all UTXOs with a fee rate of 1.3 " +
CURRENCY_ATOM +
"/vB using named arguments and sending a 0.25 " +
CURRENCY_UNIT +
" to another recipient\n" 1402 pwallet->BlockUntilSyncedToCurrentChain();
1409 std::set<std::string> addresses_without_amount;
1411 const UniValue& recipients{request.params[0]};
1412 for (
unsigned int i = 0; i < recipients.size(); ++i) {
1413 const UniValue& recipient{recipients[i]};
1414 if (recipient.isStr()) {
1416 rkvp.
pushKV(recipient.get_str(), 0);
1417 recipient_key_value_pairs.
push_back(std::move(rkvp));
1418 addresses_without_amount.insert(recipient.get_str());
1420 recipient_key_value_pairs.
push_back(recipient);
1424 if (addresses_without_amount.size() == 0) {
1430 SetFeeEstimateMode(*pwallet, coin_control, options[
"conf_target"], options[
"estimate_mode"], options[
"fee_rate"],
false);
1434 if (options.exists(
"minconf")) {
1435 if (options[
"minconf"].getInt<int>() < 0)
1440 coin_control.
m_min_depth = options[
"minconf"].getInt<
int>();
1443 if (options.exists(
"maxconf")) {
1444 coin_control.
m_max_depth = options[
"maxconf"].getInt<
int>();
1451 const bool rbf{options.exists(
"replaceable") ? options[
"replaceable"].get_bool() : pwallet->m_signal_rbf};
1466 LOCK(pwallet->cs_wallet);
1469 bool send_max{options.exists(
"send_max") ? options[
"send_max"].get_bool() :
false};
1470 if (options.exists(
"inputs") && options.exists(
"send_max")) {
1472 }
else if (options.exists(
"inputs") && (options.exists(
"minconf") || options.exists(
"maxconf"))) {
1474 }
else if (options.exists(
"inputs")) {
1475 for (
const CTxIn& input : rawTx.vin) {
1476 if (pwallet->IsSpent(input.
prevout)) {
1483 total_input_value += tx->tx->vout[input.
prevout.
n].nValue;
1490 if (send_max && fee_rate.GetFee(output.input_bytes) > output.txout.nValue) {
1494 rawTx.vin.push_back(input);
1495 total_input_value += output.txout.nValue;
1499 std::vector<COutPoint> outpoints_spent;
1500 outpoints_spent.reserve(rawTx.vin.size());
1502 for (
const CTxIn& tx_in : rawTx.vin) {
1503 outpoints_spent.push_back(tx_in.
prevout);
1508 const CAmount fee_from_size{fee_rate.GetFee(tx_size.vsize)};
1509 const std::optional<CAmount> total_bump_fees{pwallet->chain().calculateCombinedBumpFee(outpoints_spent, fee_rate)};
1510 CAmount effective_value = total_input_value - fee_from_size - total_bump_fees.value_or(0);
1512 if (fee_from_size > pwallet->m_default_max_tx_fee) {
1516 if (effective_value <= 0) {
1529 CAmount output_amounts_claimed{0};
1531 output_amounts_claimed +=
out.nValue;
1534 if (output_amounts_claimed > total_input_value) {
1538 const CAmount remainder{effective_value - output_amounts_claimed};
1539 if (remainder < 0) {
1543 const CAmount per_output_without_amount{remainder / (long)addresses_without_amount.size()};
1545 bool gave_remaining_to_first{
false};
1550 if (addresses_without_amount.count(addr) > 0) {
1551 out.nValue = per_output_without_amount;
1552 if (!gave_remaining_to_first) {
1553 out.nValue += remainder % addresses_without_amount.size();
1554 gave_remaining_to_first =
true;
1556 if (
IsDust(
out, pwallet->chain().relayDustFee())) {
1561 if (
IsDust(
out, pwallet->chain().relayDustFee())) {
1568 const bool lock_unspents{options.exists(
"lock_unspents") ? options[
"lock_unspents"].get_bool() :
false};
1569 if (lock_unspents) {
1570 for (
const CTxIn& txin : rawTx.vin) {
1571 pwallet->LockCoin(txin.
prevout);
1583 "\nUpdate a PSBT with input information from our wallet and then sign inputs\n" 1584 "that we can sign for." +
1589 {
"sighashtype",
RPCArg::Type::STR,
RPCArg::Default{
"DEFAULT for Taproot, ALL otherwise"},
"The signature hash type to sign with if not specified by the PSBT. Must be one of\n" 1594 " \"ALL|ANYONECANPAY\"\n" 1595 " \"NONE|ANYONECANPAY\"\n" 1596 " \"SINGLE|ANYONECANPAY\""},
1619 wallet.BlockUntilSyncedToCurrentChain();
1632 bool sign = request.params[1].isNull() ? true : request.params[1].get_bool();
1633 bool bip32derivs = request.params[3].isNull() ? true : request.params[3].get_bool();
1634 bool finalize = request.params[4].isNull() ? true : request.params[4].get_bool();
1635 bool complete =
true;
1639 const auto err{
wallet.FillPSBT(psbtx, complete, nHashType,
sign, bip32derivs,
nullptr, finalize)};
1648 result.pushKV(
"complete", complete);
1666 "\nCreates and funds a transaction in the Partially Signed Transaction format.\n" 1667 "Implements the Creator and Updater roles.\n" 1668 "All existing inputs must either have their previous output transaction be in the wallet\n" 1669 "or be in the UTXO set. Solving data must be provided for non-wallet inputs.\n",
1679 "including the weight of the outpoint and sequence number. " 1680 "Note that signature sizes are not guaranteed to be consistent, " 1681 "so the maximum DER signatures size of 73 bytes should be used when considering ECDSA signatures." 1682 "Remember to convert serialized sizes to weight units when necessary."},
1688 "Each key may only appear once, i.e. there can only be one 'data' output, and no address may be duplicated.\n" 1689 "At least one output of either type must be specified.\n" 1690 "For compatibility reasons, a dictionary, which holds the key-value pairs directly, is also\n" 1691 "accepted as second parameter.",
1696 Cat<std::vector<RPCArg>>(
1698 {
"add_inputs",
RPCArg::Type::BOOL,
RPCArg::DefaultHint{
"false when \"inputs\" are specified, true otherwise"},
"Automatically include coins from the wallet to cover the target amount.\n"},
1699 {
"include_unsafe",
RPCArg::Type::BOOL,
RPCArg::Default{
false},
"Include inputs that are not safe to spend (unconfirmed transactions from outside keys and unconfirmed replacement transactions).\n" 1700 "Warning: the resulting transaction may become invalid if one of the unsafe inputs disappears.\n" 1701 "If that happens, you will need to fund the transaction with different inputs and republish it."},
1706 {
"change_type",
RPCArg::Type::STR,
RPCArg::DefaultHint{
"set by -changetype"},
"The output type to use. Only valid if changeAddress is not specified. Options are \"legacy\", \"p2sh-segwit\", \"bech32\", and \"bech32m\"."},
1712 "The fee will be equally deducted from the amount of each specified output.\n" 1713 "Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n" 1714 "If no outputs are specified here, the sender pays the fee.",
1720 "Transaction building will fail if this can not be satisfied."},
1735 "\nCreate a transaction with no inputs\n" 1736 +
HelpExampleCli(
"walletcreatefundedpsbt",
"\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"")
1746 wallet.BlockUntilSyncedToCurrentChain();
1750 const UniValue &replaceable_arg = options[
"replaceable"];
1773 bool bip32derivs = request.params[4].isNull() ? true : request.params[4].get_bool();
1774 bool complete =
true;
1775 const auto err{
wallet.FillPSBT(psbtx, complete, 1,
false, bip32derivs)};
1787 result.pushKV(
"changepos", txr.change_pos ? (
int)*txr.change_pos : -1);
std::shared_ptr< const CTransaction > CTransactionRef
static RPCHelpMan bumpfee_helper(std::string method_name)
static UniValue Parse(std::string_view raw)
Parse string to UniValue or throw runtime_error if string contains invalid JSON.
void push_back(UniValue val)
bool m_avoid_partial_spends
Avoid partial use of funds sent to a given address.
std::optional< unsigned int > m_confirm_target
Override the default confirmation target if set.
static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE
Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or rep...
const std::vector< UniValue > & getValues() const
std::vector< Byte > ParseHex(std::string_view hex_str)
Like TryParseHex, but returns an empty vector on invalid input.
uint256 ParseHashO(const UniValue &o, std::string_view strKey)
void RPCTypeCheckObj(const UniValue &o, const std::map< std::string, UniValueType > &typesExpected, bool fAllowNull, bool fStrict)
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
std::string StringForFeeReason(FeeReason reason)
is a home for simple string functions returning descriptive messages that are used in RPC and GUI int...
CTxDestination destChange
Custom change destination, if not set an address is generated.
bool also_positional
If set allows a named-parameter field in an OBJ_NAMED_PARAM options object to have the same name as a...
std::map< std::string, std::string > mapValue_t
Taproot only; implied when sighash byte is missing, and equivalent to SIGHASH_ALL.
RPCHelpMan sendtoaddress()
static const uint32_t SEQUENCE_FINAL
Setting nSequence to this value for every input in a transaction disables nLockTime/IsFinalTx().
UniValue NormalizeOutputs(const UniValue &outputs_in)
Normalize univalue-represented outputs.
int ParseSighashString(const UniValue &sighash)
Returns a sighash value corresponding to the passed in argument.
#define CHECK_NONFATAL(condition)
Identity function.
bool IsHex(std::string_view str)
Special type that behaves almost exactly like OBJ, defining an options object with a list of pre-defi...
std::optional< int > m_max_tx_weight
Caps weight of resulting tx.
std::vector< CRecipient > CreateRecipients(const std::vector< std::pair< CTxDestination, CAmount >> &outputs, const std::set< int > &subtract_fee_outputs)
bool ParseIncludeWatchonly(const UniValue &include_watchonly, const CWallet &wallet)
Used by RPC commands that have an include_watchonly parameter.
CPubKey HexToPubKey(const std::string &hex_in)
static std::vector< RPCArg > FundTxDoc(bool solving_data=true)
std::string InvalidEstimateModeErrorMessage()
std::string EncodeBase64(Span< const unsigned char > input)
bool fAllowWatchOnly
Includes watch only addresses which are solvable.
bool FeeModeFromString(const std::string &mode_string, FeeEstimateMode &fee_estimate_mode)
const std::string & get_str() const
static std::vector< RPCArg > OutputsDoc()
const std::string EXAMPLE_ADDRESS[2]
Example bech32 addresses for the RPCExamples help documentation.
Use sat/vB fee rate unit.
unsigned int ParseConfirmTarget(const UniValue &value, unsigned int max_target)
Parse a confirm target option and raise an RPC error if it is invalid.
FlatSigningProvider m_external_provider
SigningProvider that has pubkeys and scripts to do spend size estimation for external inputs...
A version of CTransaction with the PSBT format.
Result CreateRateBumpTransaction(CWallet &wallet, const uint256 &txid, const CCoinControl &coin_control, std::vector< bilingual_str > &errors, CAmount &old_fee, CAmount &new_fee, CMutableTransaction &mtx, bool require_mine, const std::vector< CTxOut > &outputs, std::optional< uint32_t > original_change_index)
Create bumpfee transaction based on feerate estimates.
static void SetOptionsInputWeights(const UniValue &inputs, UniValue &options)
const std::vector< std::string > & getKeys() const
void AddOutputs(CMutableTransaction &rawTx, const UniValue &outputs_in)
Normalize, parse, and add outputs to the transaction.
bool FinalizeAndExtractPSBT(PartiallySignedTransaction &psbtx, CMutableTransaction &result)
Finalizes a PSBT if possible, and extracts it to a CMutableTransaction if it could be finalized...
void SignTransactionResultToJSON(CMutableTransaction &mtx, bool complete, const std::map< COutPoint, Coin > &coins, const std::map< int, bilingual_str > &input_errors, UniValue &result)
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
bilingual_str TransactionErrorString(const TransactionError err)
Invalid, missing or duplicate parameter.
Result CommitTransaction(CWallet &wallet, const uint256 &txid, CMutableTransaction &&mtx, std::vector< bilingual_str > &errors, uint256 &bumped_txid)
Commit the bumpfee transaction.
std::optional< OutputType > m_change_type
Override the default change type if set, ignored if destChange is set.
RPCHelpMan walletcreatefundedpsbt()
int64_t CAmount
Amount in satoshis (Can be negative)
const UniValue & find_value(std::string_view key) const
A transaction with a bunch of additional info that only the owner cares about.
std::string oneline_description
Should be empty unless it is supposed to override the auto-generated summary line.
Special type that is a STR with only hex chars.
static void SetFeeEstimateMode(const CWallet &wallet, CCoinControl &cc, const UniValue &conf_target, const UniValue &estimate_mode, const UniValue &fee_rate, bool override_min_fee)
Update coin control with fee estimation based on the given parameters.
Indicates that the wallet needs an external signer.
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
const char * uvTypeName(UniValue::VType t)
RPCHelpMan fundrawtransaction()
static constexpr uint32_t MAX_BIP125_RBF_SEQUENCE
UniValue JSONRPCError(int code, const std::string &message)
RPCHelpMan signrawtransactionwithwallet()
Special string with only hex chars.
const std::string CURRENCY_ATOM
static CAmount AmountFromValue(const UniValue &value)
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
RPCHelpMan walletprocesspsbt()
std::map< CScriptID, CScript > scripts
An input of a transaction.
util::Result< CreatedTransactionResult > CreateTransaction(CWallet &wallet, const std::vector< CRecipient > &vecSend, std::optional< unsigned int > change_pos, const CCoinControl &coin_control, bool sign)
Create a new transaction paying the recipients with a set of coins selected by SelectCoins(); Also cr...
bool DecodeBase64PSBT(PartiallySignedTransaction &psbt, const std::string &base64_tx, std::string &error)
Decode a base64ed PSBT into a PartiallySignedTransaction.
static int64_t GetTransactionInputWeight(const CTxIn &txin)
Double ended buffer combining vector and stream-like interfaces.
bool exists(const std::string &key) const
std::optional< OutputType > ParseOutputType(const std::string &type)
UniValue JSONRPCPSBTError(PSBTError err)
An encapsulated public key.
std::string ToString(const FeeEstimateMode &fee_estimate_mode=FeeEstimateMode::BTC_KVB) const
std::map< CKeyID, CPubKey > pubkeys
Special type where the user must set the keys e.g. to define multiple addresses; as opposed to e...
bool IsDust(const CRecipient &recipient, const CFeeRate &dustRelayFee)
bool fOverrideFeeRate
Override automatic min/max checks on fee, m_feerate must be set if true.
std::string ToString() const
void ParsePrevouts(const UniValue &prevTxsUnival, FlatSigningProvider *keystore, std::map< COutPoint, Coin > &coins)
Parse a prevtxs UniValue array and get the map of coins from it.
const std::string CURRENCY_UNIT
void SetInputWeight(const COutPoint &outpoint, int64_t weight)
Set an input's weight.
std::set< int > InterpretSubtractFeeFromOutputInstructions(const UniValue &sffo_instructions, const std::vector< std::string > &destinations)
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
General application defined errors.
CMutableTransaction ConstructTransaction(const UniValue &inputs_in, const UniValue &outputs_in, const UniValue &locktime, std::optional< bool > rbf)
Create a transaction from univalue parameters.
std::string DefaultHint
Hint for default value.
An output of a transaction.
An outpoint - a combination of a transaction hash and an index n into its vout.
std::string HelpExampleCli(const std::string &methodname, const std::string &args)
std::vector< CTxOut > vout
const std::string HELP_REQUIRING_PASSPHRASE
TxSize CalculateMaximumSignedTxSize(const CTransaction &tx, const CWallet *wallet, const std::vector< CTxOut > &txouts, const CCoinControl *coin_control)
Calculate the size of the transaction using CoinControl to determine whether to expect signature grin...
bool m_avoid_address_reuse
Forbids inclusion of dirty (previously used) addresses.
CFeeRate GetMinimumFeeRate(const CWallet &wallet, const CCoinControl &coin_control, FeeCalculation *feeCalc)
Estimate the minimum fee rate considering user set parameters and the required fee.
FlatSigningProvider & Merge(FlatSigningProvider &&b) LIFETIMEBOUND
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
static CTransactionRef MakeTransactionRef(Tx &&txIn)
static void PreventOutdatedOptions(const UniValue &options)
bool SignTransaction(CWallet &wallet, CMutableTransaction &mtx)
Sign the new transaction,.
static int sign(const secp256k1_context *ctx, struct signer_secrets *signer_secrets, struct signer *signer, const secp256k1_musig_keyagg_cache *cache, const unsigned char *msg32, unsigned char *sig64)
Optional argument for which the default value is omitted from help text for one of two reasons: ...
static constexpr int32_t MAX_STANDARD_TX_WEIGHT
The maximum weight for transactions we're willing to relay/mine.
std::string EncodeHexTx(const CTransaction &tx)
int m_min_depth
Minimum chain depth value for coin availability.
Special string to represent a floating point amount.
void pushKV(std::string key, UniValue val)
Serialized script, used inside transaction inputs and outputs.
static transaction_identifier FromUint256(const uint256 &id)
CreatedTransactionResult FundTransaction(CWallet &wallet, const CMutableTransaction &tx, const std::vector< CRecipient > &recipients, const UniValue &options, CCoinControl &coinControl, bool override_min_fee)
uint256 ParseHashV(const UniValue &v, std::string_view name)
Utilities: convert hex-encoded Values (throws error if not hex).
bool m_include_unsafe_inputs
If false, only safe inputs will be used.
Not enough funds in wallet or account.
FeeEstimateMode m_fee_mode
Fee estimation mode to control arguments to estimateSmartFee.
const UniValue & get_obj() const
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
Special type representing a floating point amount (can be either NUM or STR)
bool DecodeHexTx(CMutableTransaction &tx, const std::string &hex_tx, bool try_no_witness=false, bool try_witness=true)
CoinsResult AvailableCoins(const CWallet &wallet, const CCoinControl *coinControl, std::optional< CFeeRate > feerate, const CoinFilterParams ¶ms)
Populate the CoinsResult struct with vectors of available COutputs, organized by OutputType.
std::string GetHex() const
bool m_allow_other_inputs
If true, the selection process can add extra unselected inputs from the wallet while requires all sel...
std::string HexStr(const Span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
UniValue ValueFromAmount(const CAmount amount)
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
const UniValue NullUniValue
bool GetAvoidReuseFlag(const CWallet &wallet, const UniValue ¶m)
void EnsureWalletIsUnlocked(const CWallet &wallet)
bilingual_str ErrorString(const Result< T > &result)
A reference to a CScript: the Hash160 of its serialization.
std::vector< std::pair< CTxDestination, CAmount > > ParseOutputs(const UniValue &outputs)
Parse normalized outputs into destination, amount tuples.
std::string EncodeDestination(const CTxDestination &dest)
Standard JSON-RPC 2.0 errors.
A mutable version of CTransaction.
The basic transaction that is broadcasted on the network and contained in blocks. ...
static void InterpretFeeEstimationInstructions(const UniValue &conf_target, const UniValue &estimate_mode, const UniValue &fee_rate, UniValue &options)
int m_max_depth
Maximum chain depth value for coin availability.
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg, std::vector< int > *error_locations)
is a home for public enum and struct type definitions that are used internally by node code...
static UniValue FinishTransaction(const std::shared_ptr< CWallet > pwallet, const UniValue &options, const CMutableTransaction &rawTx)
std::optional< bool > m_signal_bip125_rbf
Override the wallet's m_signal_rbf if set.
A UTXO under consideration for use in funding a new transaction.
std::optional< CFeeRate > m_feerate
Override the wallet's m_pay_tx_fee if set.
std::string FeeModesDetail(std::string default_info)
Wrapper for UniValue::VType, which includes typeAny: Used to denote don't care type.
std::shared_ptr< CWallet > GetWalletForJSONRPCRequest(const JSONRPCRequest &request)
Figures out what wallet, if any, to use for a JSONRPCRequest.
UniValue SendMoney(CWallet &wallet, const CCoinControl &coin_control, std::vector< CRecipient > &recipients, mapValue_t map_value, bool verbose)
Error parsing or validating structure in raw format.
static constexpr TransactionSerParams TX_WITH_WITNESS
V Cat(V v1, V &&v2)
Concatenate two vectors, moving elements.