28 std::set<CTxDestination> destinations;
30 for (
const std::string& address: address_amounts.
getKeys()) {
36 if (destinations.count(dest)) {
39 destinations.insert(dest);
44 bool subtract_fee =
false;
45 for (
unsigned int idx = 0; idx < subtract_fee_outputs.
size(); idx++) {
46 const UniValue& addr = subtract_fee_outputs[idx];
47 if (addr.
get_str() == address) {
52 CRecipient recipient = {script_pub_key, amount, subtract_fee};
59 if (options.
exists(
"conf_target") || options.
exists(
"estimate_mode")) {
64 options.
pushKV(
"conf_target", conf_target);
65 options.
pushKV(
"estimate_mode", estimate_mode);
67 if (options.
exists(
"fee_rate")) {
72 options.
pushKV(
"fee_rate", fee_rate);
74 if (!options[
"conf_target"].isNull() && (options[
"estimate_mode"].isNull() || (options[
"estimate_mode"].get_str() ==
"unset"))) {
98 const bool psbt_opt_in{options.
exists(
"psbt") && options[
"psbt"].
get_bool()};
99 bool add_to_wallet{options.
exists(
"add_to_wallet") ? options[
"add_to_wallet"].
get_bool() :
true};
100 if (psbt_opt_in || !complete || !add_to_wallet) {
110 result.
pushKV(
"txid", tx->GetHash().GetHex());
111 if (add_to_wallet && !psbt_opt_in) {
112 pwallet->CommitTransaction(tx, {}, {});
114 result.
pushKV(
"hex", hex);
117 result.
pushKV(
"complete", complete);
124 if (options.
exists(
"feeRate")) {
127 if (options.
exists(
"changeAddress")) {
130 if (options.
exists(
"changePosition")) {
133 if (options.
exists(
"includeWatching")) {
136 if (options.
exists(
"lockUnspents")) {
139 if (options.
exists(
"subtractFeeFromOutputs")) {
158 constexpr
int RANDOM_CHANGE_POSITION = -1;
164 wallet.CommitTransaction(tx, std::move(map_value), {});
167 entry.
pushKV(
"txid", tx->GetHash().GetHex());
171 return tx->GetHash().GetHex();
191 if (!conf_target.
isNull()) {
192 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.");
194 if (!estimate_mode.
isNull() && estimate_mode.
get_str() !=
"unset") {
207 if (!conf_target.
isNull()) {
215 "\nSend an amount to a given address." +
221 "This is not part of the transaction, just kept in your wallet."},
223 "to which you're sending the transaction. This is not part of the \n"
224 "transaction, just kept in your wallet."},
226 "The recipient will receive less bitcoins than you enter in the amount field."},
231 {
"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"
232 "dirty if they have previously been used in a transaction. If true, this also activates avoidpartialspends, grouping outputs by their addresses."},
237 RPCResult{
"if verbose is not set or set to false",
251 "\nSend 0.1 BTC with a confirmation target of 6 blocks in economical fee estimate mode using positional arguments\n"
253 "\nSend 0.1 BTC with a fee rate of 1.1 " +
CURRENCY_ATOM +
"/vB, subtract fee from amount, BIP125-replaceable, using positional arguments\n"
255 "\nSend 0.2 BTC with a confirmation target of 6 blocks in economical fee estimate mode using named arguments\n"
257 "\nSend 0.5 BTC with a fee rate of 25 " +
CURRENCY_ATOM +
"/vB using named arguments\n"
259 +
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")
268 pwallet->BlockUntilSyncedToCurrentChain();
270 LOCK(pwallet->cs_wallet);
274 if (!request.params[2].isNull() && !request.params[2].get_str().empty())
275 mapValue[
"comment"] = request.params[2].get_str();
276 if (!request.params[3].isNull() && !request.params[3].get_str().empty())
277 mapValue[
"to"] = request.params[3].get_str();
279 bool fSubtractFeeFromAmount =
false;
280 if (!request.params[4].isNull()) {
281 fSubtractFeeFromAmount = request.params[4].get_bool();
285 if (!request.params[5].isNull()) {
293 SetFeeEstimateMode(*pwallet, coin_control, request.params[6], request.params[7], request.params[9],
false);
298 const std::string address = request.params[0].get_str();
299 address_amounts.
pushKV(address, request.params[1]);
301 if (fSubtractFeeFromAmount) {
302 subtractFeeFromAmount.
push_back(address);
305 std::vector<CRecipient> recipients;
307 const bool verbose{request.params[10].isNull() ? false : request.params[10].get_bool()};
309 return SendMoney(*pwallet, coin_control, recipients, mapValue, verbose);
317 "Send multiple times. Amounts are double-precision floating point numbers." +
332 "The fee will be equally deducted from the amount of each selected address.\n"
333 "Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n"
334 "If no addresses are specified here, the sender pays the fee.",
347 RPCResult{
"if verbose is not set or set to false",
349 "the number of addresses."
355 "the number of addresses."},
361 "\nSend two amounts to two different addresses:\n"
363 "\nSend two amounts to two different addresses setting the confirmation and comment:\n"
365 "\nSend two amounts to two different addresses, subtract fee from amount:\n"
367 "\nAs a JSON-RPC call\n"
377 pwallet->BlockUntilSyncedToCurrentChain();
379 LOCK(pwallet->cs_wallet);
381 if (!request.params[0].isNull() && !request.params[0].get_str().empty()) {
387 if (!request.params[3].isNull() && !request.params[3].get_str().empty())
388 mapValue[
"comment"] = request.params[3].
get_str();
391 if (!request.params[4].isNull())
392 subtractFeeFromAmount = request.params[4].
get_array();
395 if (!request.params[5].isNull()) {
399 SetFeeEstimateMode(*pwallet, coin_control, request.params[6], request.params[7], request.params[8],
false);
401 std::vector<CRecipient> recipients;
403 const bool verbose{request.params[9].isNull() ? false : request.params[9].get_bool()};
405 return SendMoney(*pwallet, coin_control, recipients, std::move(mapValue), verbose);
413 "\nSet the transaction fee rate in " +
CURRENCY_UNIT +
"/kvB for this wallet. Overrides the global -paytxfee command line parameter.\n"
414 "Can be deactivated by passing 0 as the fee. In that case automatic fee selection will be used by default.\n",
430 LOCK(pwallet->cs_wallet);
433 CFeeRate tx_fee_rate(nAmount, 1000);
434 CFeeRate max_tx_fee_rate(pwallet->m_default_max_tx_fee, 1000);
437 }
else if (tx_fee_rate < pwallet->chain().relayMinFee()) {
439 }
else if (tx_fee_rate < pwallet->m_min_fee) {
441 }
else if (tx_fee_rate > max_tx_fee_rate) {
445 pwallet->m_pay_tx_fee = tx_fee_rate;
453 static std::vector<RPCArg>
FundTxDoc(
bool solving_data =
true)
455 std::vector<RPCArg>
args = {
461 "Allows this transaction to be replaced by a transaction with higher fees"
466 "Used for fee estimation during coin selection.",
496 wallet.BlockUntilSyncedToCurrentChain();
498 change_position = -1;
499 bool lockUnspents =
false;
501 std::set<int> setSubtractFeeFromOutputs;
540 if (options.
exists(
"add_inputs")) {
544 if (options.
exists(
"changeAddress") || options.
exists(
"change_address")) {
545 const std::string change_address_str = (options.
exists(
"change_address") ? options[
"change_address"] : options[
"changeAddress"]).get_str();
555 if (options.
exists(
"changePosition") || options.
exists(
"change_position")) {
556 change_position = (options.
exists(
"change_position") ? options[
"change_position"] : options[
"changePosition"]).getInt<int>();
559 if (options.
exists(
"change_type")) {
560 if (options.
exists(
"changeAddress") || options.
exists(
"change_address")) {
563 if (std::optional<OutputType> parsed =
ParseOutputType(options[
"change_type"].get_str())) {
570 const UniValue include_watching_option = options.
exists(
"include_watching") ? options[
"include_watching"] : options[
"includeWatching"];
573 if (options.
exists(
"lockUnspents") || options.
exists(
"lock_unspents")) {
574 lockUnspents = (options.
exists(
"lock_unspents") ? options[
"lock_unspents"] : options[
"lockUnspents"]).get_bool();
577 if (options.
exists(
"include_unsafe")) {
581 if (options.
exists(
"feeRate")) {
582 if (options.
exists(
"fee_rate")) {
585 if (options.
exists(
"conf_target")) {
586 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.");
588 if (options.
exists(
"estimate_mode")) {
595 if (options.
exists(
"subtractFeeFromOutputs") || options.
exists(
"subtract_fee_from_outputs") )
596 subtractFeeFromOutputs = (options.
exists(
"subtract_fee_from_outputs") ? options[
"subtract_fee_from_outputs"] : options[
"subtractFeeFromOutputs"]).get_array();
598 if (options.
exists(
"replaceable")) {
602 if (options.
exists(
"minconf")) {
610 if (options.
exists(
"maxconf")) {
617 SetFeeEstimateMode(
wallet, coinControl, options[
"conf_target"], options[
"estimate_mode"], options[
"fee_rate"], override_min_fee);
624 if (options.
exists(
"solving_data")) {
626 if (solving_data.
exists(
"pubkeys")) {
627 for (
const UniValue& pk_univ : solving_data[
"pubkeys"].get_array().getValues()) {
628 const std::string& pk_str = pk_univ.
get_str();
629 if (!
IsHex(pk_str)) {
632 const std::vector<unsigned char> data(
ParseHex(pk_str));
633 const CPubKey pubkey(data.begin(), data.end());
644 if (solving_data.
exists(
"scripts")) {
645 for (
const UniValue& script_univ : solving_data[
"scripts"].get_array().getValues()) {
646 const std::string& script_str = script_univ.get_str();
647 if (!
IsHex(script_str)) {
650 std::vector<unsigned char> script_data(
ParseHex(script_str));
651 const CScript script(script_data.begin(), script_data.end());
656 if (solving_data.
exists(
"descriptors")) {
657 for (
const UniValue& desc_univ : solving_data[
"descriptors"].get_array().getValues()) {
658 const std::string& desc_str = desc_univ.get_str();
661 std::vector<CScript> scripts_temp;
662 std::unique_ptr<Descriptor> desc =
Parse(desc_str, desc_out,
error,
true);
666 desc->Expand(0, desc_out, scripts_temp, desc_out);
672 if (options.
exists(
"input_weights")) {
673 for (
const UniValue& input : options[
"input_weights"].get_array().getValues()) {
677 if (!vout_v.
isNum()) {
680 int vout = vout_v.
getInt<
int>();
686 if (!weight_v.
isNum()) {
689 int64_t weight = weight_v.
getInt<int64_t>();
692 if (weight < min_input_weight) {
693 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)");
703 if (tx.
vout.size() == 0)
706 if (change_position != -1 && (change_position < 0 || (
unsigned int)change_position > tx.
vout.size()))
709 for (
unsigned int idx = 0; idx < subtractFeeFromOutputs.
size(); idx++) {
710 int pos = subtractFeeFromOutputs[idx].
getInt<
int>();
711 if (setSubtractFeeFromOutputs.count(pos))
715 if (pos >=
int(tx.
vout.size()))
717 setSubtractFeeFromOutputs.insert(pos);
729 if (options.
exists(
"input_weights")) {
732 if (inputs.
size() == 0) {
737 if (input.exists(
"weight")) {
741 options.
pushKV(
"input_weights", weights);
747 "\nIf the transaction has no inputs, they will be automatically selected to meet its out value.\n"
748 "It will add at most one change output to the outputs.\n"
749 "No existing outputs will be modified unless \"subtractFeeFromOutputs\" is specified.\n"
750 "Note that inputs which were signed may need to be resigned after completion since in/outputs have been added.\n"
751 "The inputs added will not be signed, use signrawtransactionwithkey\n"
752 "or signrawtransactionwithwallet for that.\n"
753 "All existing inputs must either have their previous output transaction be in the wallet\n"
754 "or be in the UTXO set. Solving data must be provided for non-wallet inputs.\n"
755 "Note that all inputs selected must be of standard form and P2SH scripts must be\n"
756 "in the wallet using importaddress or addmultisigaddress (to calculate fees).\n"
757 "You can see whether this is the case by checking the \"solvable\" field in the listunspent output.\n"
758 "Only pay-to-pubkey, multisig, and P2SH versions thereof are currently supported for watch-only\n",
762 Cat<std::vector<RPCArg>>(
765 {
"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"
766 "Warning: the resulting transaction may become invalid if one of the unsafe inputs disappears.\n"
767 "If that happens, you will need to fund the transaction with different inputs and republish it."},
772 {
"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\"."},
774 "Only solvable inputs can be used. Watch-only destinations are solvable if the public key and/or output script was imported,\n"
775 "e.g. with 'importpubkey' or 'importmulti' with the 'pubkeys' or 'desc' field."},
780 "The fee will be equally deducted from the amount of each specified output.\n"
781 "Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n"
782 "If no outputs are specified here, the sender pays the fee.",
794 "including the weight of the outpoint and sequence number. "
795 "Note that serialized signature sizes are not guaranteed to be consistent, "
796 "so the maximum DER signatures size of 73 bytes should be used when considering ECDSA signatures."
797 "Remember to convert serialized sizes to weight units when necessary."},
806 .oneline_description =
"options",
809 "If iswitness is not present, heuristic tests will be used in decoding.\n"
810 "If true, only witness deserialization will be tried.\n"
811 "If false, only non-witness deserialization will be tried.\n"
812 "This boolean should reflect whether the transaction has inputs\n"
813 "(e.g. fully valid, or on-chain transactions), if known by the caller."
825 "\nCreate a transaction with no inputs\n"
826 +
HelpExampleCli(
"createrawtransaction",
"\"[]\" \"{\\\"myaddress\\\":0.01}\"") +
827 "\nAdd sufficient unsigned inputs to meet the output value\n"
829 "\nSign the transaction\n"
830 +
HelpExampleCli(
"signrawtransactionwithwallet",
"\"fundedtransactionhex\"") +
831 "\nSend the transaction\n"
832 +
HelpExampleCli(
"sendrawtransaction",
"\"signedtransactionhex\"")
841 bool try_witness = request.params[2].isNull() ? true : request.params[2].get_bool();
842 bool try_no_witness = request.params[2].isNull() ? true : !request.params[2].get_bool();
843 if (!
DecodeHexTx(tx, request.params[0].get_str(), try_no_witness, try_witness)) {
852 FundTransaction(*pwallet, tx, fee, change_position, request.params[1], coin_control,
true);
857 result.
pushKV(
"changepos", change_position);
866 return RPCHelpMan{
"signrawtransactionwithwallet",
867 "\nSign inputs for raw transaction (serialized, hex-encoded).\n"
868 "The second optional argument (may be null) is an array of previous transaction outputs that\n"
869 "this transaction depends on but may not yet be in the block chain." +
892 " \"ALL|ANYONECANPAY\"\n"
893 " \"NONE|ANYONECANPAY\"\n"
894 " \"SINGLE|ANYONECANPAY\""},
928 if (!
DecodeHexTx(mtx, request.params[0].get_str())) {
933 LOCK(pwallet->cs_wallet);
937 std::map<COutPoint, Coin> coins;
941 pwallet->chain().findCoins(coins);
949 std::map<int, bilingual_str> input_errors;
951 bool complete = pwallet->SignTransaction(mtx, coins, nHashType, input_errors);
961 const bool want_psbt = method_name ==
"psbtbumpfee";
965 "\nBumps the fee of an opt-in-RBF transaction T, replacing it with a new transaction B.\n"
966 + std::string(want_psbt ?
"Returns a PSBT instead of creating and signing a new transaction.\n" :
"") +
967 "An opt-in RBF transaction with the given txid must be in the wallet.\n"
968 "The command will pay the additional fee by reducing change outputs or adding inputs when necessary.\n"
969 "It may add a new change output if one does not already exist.\n"
970 "All inputs in the original transaction will be included in the replacement transaction.\n"
971 "The command will fail if the wallet or mempool contains a transaction that spends one of T's outputs.\n"
972 "By default, the new fee will be calculated automatically using the estimatesmartfee RPC.\n"
973 "The user can specify a confirmation target for estimatesmartfee.\n"
974 "Alternatively, the user can specify a fee rate in " +
CURRENCY_ATOM +
"/vB for the new transaction.\n"
975 "At a minimum, the new fee rate must be high enough to pay an additional new relay fee (incrementalfee\n"
976 "returned by getnetworkinfo) to enter the node's mempool.\n"
977 "* WARNING: before version 0.21, fee_rate was in " +
CURRENCY_UNIT +
"/kvB. As of 0.21, fee_rate is in " +
CURRENCY_ATOM +
"/vB. *\n",
984 "\nSpecify a fee rate in " +
CURRENCY_ATOM +
"/vB instead of relying on the built-in fee estimator.\n"
985 "Must be at least " + incremental_fee +
" higher than the current transaction fee rate.\n"
986 "WARNING: before version 0.21, fee_rate was in " +
CURRENCY_UNIT +
"/kvB. As of 0.21, fee_rate is in " +
CURRENCY_ATOM +
"/vB.\n"},
988 "marked bip-125 replaceable. If true, the sequence numbers in the transaction will\n"
989 "be left unchanged from the original. If false, any input sequence numbers in the\n"
990 "original transaction that were less than 0xfffffffe will be increased to 0xfffffffe\n"
991 "so the new transaction will not be explicitly bip-125 replaceable (though it may\n"
992 "still be replaceable in practice, for example if it has unconfirmed ancestors which\n"
993 "are replaceable).\n"},
1002 std::vector<RPCResult>{{
RPCResult::Type::STR,
"psbt",
"The base64-encoded unsigned PSBT of the new transaction."}} :
1014 "\nBump the fee, get the new transaction\'s " + std::string(want_psbt ?
"psbt" :
"txid") +
"\n" +
1023 throw JSONRPCError(
RPC_WALLET_ERROR,
"bumpfee is not available with wallets that have private keys disabled. Use psbtbumpfee instead.");
1033 if (!request.params[1].isNull()) {
1034 UniValue options = request.params[1];
1045 if (options.
exists(
"confTarget") && options.
exists(
"conf_target")) {
1049 auto conf_target = options.
exists(
"confTarget") ? options[
"confTarget"] : options[
"conf_target"];
1051 if (options.
exists(
"replaceable")) {
1054 SetFeeEstimateMode(*pwallet, coin_control, conf_target, options[
"estimate_mode"], options[
"fee_rate"],
false);
1059 pwallet->BlockUntilSyncedToCurrentChain();
1061 LOCK(pwallet->cs_wallet);
1066 std::vector<bilingual_str> errors;
1113 bool complete =
false;
1128 result.
pushKV(
"errors", result_errors);
1141 "\nEXPERIMENTAL warning: this call may be changed in future releases.\n"
1142 "\nSend a transaction.\n",
1145 "That is, each address can only appear once and there can only be one 'data' object.\n"
1146 "For convenience, a dictionary, which holds the key-value pairs directly, is also accepted.",
1165 Cat<std::vector<RPCArg>>(
1167 {
"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"},
1168 {
"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"
1169 "Warning: the resulting transaction may become invalid if one of the unsafe inputs disappears.\n"
1170 "If that happens, you will need to fund the transaction with different inputs and republish it."},
1173 {
"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"},
1176 {
"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\"."},
1179 "Only solvable inputs can be used. Watch-only destinations are solvable if the public key and/or output script was imported,\n"
1180 "e.g. with 'importpubkey' or 'importmulti' with the 'pubkeys' or 'desc' field."},
1187 "including the weight of the outpoint and sequence number. "
1188 "Note that signature sizes are not guaranteed to be consistent, "
1189 "so the maximum DER signatures size of 73 bytes should be used when considering ECDSA signatures."
1190 "Remember to convert serialized sizes to weight units when necessary."},
1197 "The fee will be equally deducted from the amount of each specified output.\n"
1198 "Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n"
1199 "If no outputs are specified here, the sender pays the fee.",
1212 {
RPCResult::Type::STR_HEX,
"txid",
true,
"The transaction id for the send. Only 1 transaction is created regardless of the number of addresses."},
1213 {
RPCResult::Type::STR_HEX,
"hex",
true,
"If add_to_wallet is false, the hex-encoded raw transaction with signature(s)"},
1214 {
RPCResult::Type::STR,
"psbt",
true,
"If more signatures are needed, or if add_to_wallet is false, the base64-encoded (partially) signed transaction"}
1218 "\nSend 0.1 BTC with a confirmation target of 6 blocks in economical fee estimate mode\n"
1220 "Send 0.2 BTC with a fee rate of 1.1 " +
CURRENCY_ATOM +
"/vB using positional arguments\n"
1222 "Send 0.2 BTC with a fee rate of 1 " +
CURRENCY_ATOM +
"/vB using the options argument\n"
1224 "Send 0.3 BTC with a fee rate of 25 " +
CURRENCY_ATOM +
"/vB using named arguments\n"
1226 "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"
1227 +
HelpExampleCli(
"send",
"'{\"" +
EXAMPLE_ADDRESS[0] +
"\": 0.1}' 1 economical '{\"add_to_wallet\": false, \"inputs\": [{\"txid\":\"a08e6907dbbd3d809776dbfc5d82e371b764ed838b5655e72f463568df1aadf0\", \"vout\":1}]}'")
1240 int change_position;
1241 bool rbf{options.exists(
"replaceable") ? options[
"replaceable"].get_bool() : pwallet->m_signal_rbf};
1248 FundTransaction(*pwallet, rawTx, fee, change_position, options, coin_control,
false);
1258 "EXPERIMENTAL warning: this call may be changed in future releases.\n"
1259 "\nSpend the value of all (or specific) confirmed UTXOs in the wallet to one or more recipients.\n"
1260 "Unconfirmed inbound UTXOs and locked UTXOs will not be spent. Sendall will respect the avoid_reuse wallet flag.\n"
1261 "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",
1264 "Optionally some recipients can be specified with an amount to perform payments, but at least one address must appear without a specified amount.\n",
1280 Cat<std::vector<RPCArg>>(
1285 "Only solvable inputs can be used. Watch-only destinations are solvable if the public key and/or output script was imported,\n"
1286 "e.g. with 'importpubkey' or 'importmulti' with the 'pubkeys' or 'desc' field."},
1301 {
"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."},
1314 {
RPCResult::Type::STR_HEX,
"txid",
true,
"The transaction id for the send. Only 1 transaction is created regardless of the number of addresses."},
1315 {
RPCResult::Type::STR_HEX,
"hex",
true,
"If add_to_wallet is false, the hex-encoded raw transaction with signature(s)"},
1316 {
RPCResult::Type::STR,
"psbt",
true,
"If more signatures are needed, or if add_to_wallet is false, the base64-encoded (partially) signed transaction"}
1320 "\nSpend all UTXOs from the wallet with a fee rate of 1Â " +
CURRENCY_ATOM +
"/vB using named arguments\n"
1322 "Spend all UTXOs with a fee rate of 1.1 " +
CURRENCY_ATOM +
"/vB using positional arguments\n"
1324 "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"
1326 "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"
1328 "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"
1337 pwallet->BlockUntilSyncedToCurrentChain();
1344 std::set<std::string> addresses_without_amount;
1346 const UniValue& recipients{request.params[0]};
1347 for (
unsigned int i = 0; i < recipients.size(); ++i) {
1348 const UniValue& recipient{recipients[i]};
1349 if (recipient.isStr()) {
1351 rkvp.
pushKV(recipient.get_str(), 0);
1352 recipient_key_value_pairs.
push_back(rkvp);
1353 addresses_without_amount.insert(recipient.get_str());
1355 recipient_key_value_pairs.
push_back(recipient);
1359 if (addresses_without_amount.size() == 0) {
1365 SetFeeEstimateMode(*pwallet, coin_control, options[
"conf_target"], options[
"estimate_mode"], options[
"fee_rate"],
false);
1369 if (options.exists(
"minconf")) {
1370 if (options[
"minconf"].getInt<int>() < 0)
1375 coin_control.
m_min_depth = options[
"minconf"].getInt<
int>();
1378 if (options.exists(
"maxconf")) {
1379 coin_control.
m_max_depth = options[
"maxconf"].getInt<
int>();
1386 const bool rbf{options.exists(
"replaceable") ? options[
"replaceable"].get_bool() : pwallet->m_signal_rbf};
1401 LOCK(pwallet->cs_wallet);
1404 bool send_max{options.exists(
"send_max") ? options[
"send_max"].get_bool() :
false};
1405 if (options.exists(
"inputs") && options.exists(
"send_max")) {
1407 }
else if (options.exists(
"inputs") && (options.exists(
"minconf") || options.exists(
"maxconf"))) {
1409 }
else if (options.exists(
"inputs")) {
1410 for (
const CTxIn& input : rawTx.vin) {
1411 if (pwallet->IsSpent(input.
prevout)) {
1418 total_input_value += tx->tx->vout[input.
prevout.
n].nValue;
1425 if (send_max && fee_rate.GetFee(output.input_bytes) > output.txout.nValue) {
1429 rawTx.vin.push_back(input);
1430 total_input_value += output.txout.nValue;
1436 const CAmount fee_from_size{fee_rate.GetFee(tx_size.vsize)};
1437 const CAmount effective_value{total_input_value - fee_from_size};
1439 if (fee_from_size > pwallet->m_default_max_tx_fee) {
1443 if (effective_value <= 0) {
1456 CAmount output_amounts_claimed{0};
1457 for (
const CTxOut& out : rawTx.vout) {
1458 output_amounts_claimed += out.
nValue;
1461 if (output_amounts_claimed > total_input_value) {
1465 const CAmount remainder{effective_value - output_amounts_claimed};
1466 if (remainder < 0) {
1470 const CAmount per_output_without_amount{remainder / (long)addresses_without_amount.size()};
1472 bool gave_remaining_to_first{
false};
1473 for (
CTxOut& out : rawTx.vout) {
1477 if (addresses_without_amount.count(addr) > 0) {
1478 out.
nValue = per_output_without_amount;
1479 if (!gave_remaining_to_first) {
1480 out.
nValue += remainder % addresses_without_amount.size();
1481 gave_remaining_to_first =
true;
1483 if (
IsDust(out, pwallet->chain().relayDustFee())) {
1488 if (
IsDust(out, pwallet->chain().relayDustFee())) {
1495 const bool lock_unspents{options.exists(
"lock_unspents") ? options[
"lock_unspents"].get_bool() :
false};
1496 if (lock_unspents) {
1497 for (
const CTxIn& txin : rawTx.vin) {
1498 pwallet->LockCoin(txin.
prevout);
1510 "\nUpdate a PSBT with input information from our wallet and then sign inputs\n"
1511 "that we can sign for." +
1516 {
"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"
1521 " \"ALL|ANYONECANPAY\"\n"
1522 " \"NONE|ANYONECANPAY\"\n"
1523 " \"SINGLE|ANYONECANPAY\""},
1545 wallet.BlockUntilSyncedToCurrentChain();
1558 bool sign = request.params[1].isNull() ? true : request.params[1].get_bool();
1559 bool bip32derivs = request.params[3].isNull() ? true : request.params[3].get_bool();
1560 bool finalize = request.params[4].isNull() ? true : request.params[4].get_bool();
1561 bool complete =
true;
1565 const TransactionError err{
wallet.FillPSBT(psbtx, complete, nHashType, sign, bip32derivs,
nullptr, finalize)};
1574 result.
pushKV(
"complete", complete);
1584 "\nCreates and funds a transaction in the Partially Signed Transaction format.\n"
1585 "Implements the Creator and Updater roles.\n"
1586 "All existing inputs must either have their previous output transaction be in the wallet\n"
1587 "or be in the UTXO set. Solving data must be provided for non-wallet inputs.\n",
1597 "including the weight of the outpoint and sequence number. "
1598 "Note that signature sizes are not guaranteed to be consistent, "
1599 "so the maximum DER signatures size of 73 bytes should be used when considering ECDSA signatures."
1600 "Remember to convert serialized sizes to weight units when necessary."},
1606 "That is, each address can only appear once and there can only be one 'data' object.\n"
1607 "For compatibility reasons, a dictionary, which holds the key-value pairs directly, is also\n"
1608 "accepted as second parameter.",
1624 Cat<std::vector<RPCArg>>(
1626 {
"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"},
1627 {
"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"
1628 "Warning: the resulting transaction may become invalid if one of the unsafe inputs disappears.\n"
1629 "If that happens, you will need to fund the transaction with different inputs and republish it."},
1634 {
"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\"."},
1640 "The fee will be equally deducted from the amount of each specified output.\n"
1641 "Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n"
1642 "If no outputs are specified here, the sender pays the fee.",
1661 "\nCreate a transaction with no inputs\n"
1662 +
HelpExampleCli(
"walletcreatefundedpsbt",
"\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"[{\\\"data\\\":\\\"00010203\\\"}]\"")
1672 wallet.BlockUntilSyncedToCurrentChain();
1677 int change_position;
1678 const UniValue &replaceable_arg = options[
"replaceable"];
1692 bool bip32derivs = request.params[4].isNull() ? true : request.params[4].get_bool();
1693 bool complete =
true;
1706 result.
pushKV(
"changepos", change_position);
int64_t CAmount
Amount in satoshis (Can be negative)
static CAmount AmountFromValue(const UniValue &value)
#define CHECK_NONFATAL(condition)
Identity function.
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
std::string ToString(const FeeEstimateMode &fee_estimate_mode=FeeEstimateMode::BTC_KVB) const
An outpoint - a combination of a transaction hash and an index n into its vout.
An encapsulated public key.
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
bool IsFullyValid() const
fully validate whether this is a valid public key (more expensive than IsValid())
Serialized script, used inside transaction inputs and outputs.
A reference to a CScript: the Hash160 of its serialization (see script.h)
The basic transaction that is broadcasted on the network and contained in blocks.
An input of a transaction.
static const uint32_t SEQUENCE_FINAL
Setting nSequence to this value for every input in a transaction disables nLockTime/IsFinalTx().
An output of a transaction.
void push_back(UniValue val)
const std::string & get_str() const
const UniValue & get_obj() const
const std::vector< UniValue > & getValues() const
const std::vector< std::string > & getKeys() const
const UniValue & get_array() const
bool exists(const std::string &key) const
void pushKV(std::string key, UniValue val)
std::string ToString() const
std::string GetHex() const
void push_back(const T &value)
FeeEstimateMode m_fee_mode
Fee estimation mode to control arguments to estimateSmartFee.
std::optional< bool > m_signal_bip125_rbf
Override the wallet's m_signal_rbf if set.
std::optional< unsigned int > m_confirm_target
Override the default confirmation target if set.
std::optional< OutputType > m_change_type
Override the default change type if set, ignored if destChange is set.
bool m_avoid_address_reuse
Forbids inclusion of dirty (previously used) addresses.
int m_min_depth
Minimum chain depth value for coin availability.
bool m_allow_other_inputs
If true, the selection process can add extra unselected inputs from the wallet while requires all sel...
int m_max_depth
Maximum chain depth value for coin availability.
bool fOverrideFeeRate
Override automatic min/max checks on fee, m_feerate must be set if true.
void SetInputWeight(const COutPoint &outpoint, int64_t weight)
std::optional< CFeeRate > m_feerate
Override the wallet's m_pay_tx_fee if set.
bool m_include_unsafe_inputs
If false, only safe inputs will be used.
bool m_avoid_partial_spends
Avoid partial use of funds sent to a given address.
bool fAllowWatchOnly
Includes watch only addresses which are solvable.
FlatSigningProvider m_external_provider
SigningProvider that has pubkeys and scripts to do spend size estimation for external inputs.
CTxDestination destChange
Custom change destination, if not set an address is generated.
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
A transaction with a bunch of additional info that only the owner cares about.
static int64_t GetTransactionInputWeight(const CTxIn &txin)
int ParseSighashString(const UniValue &sighash)
std::string EncodeHexTx(const CTransaction &tx, const int serializeFlags=0)
UniValue ValueFromAmount(const CAmount amount)
bool DecodeHexTx(CMutableTransaction &tx, const std::string &hex_tx, bool try_no_witness=false, bool try_witness=true)
std::unique_ptr< Descriptor > Parse(const std::string &descriptor, FlatSigningProvider &out, std::string &error, bool require_checksum)
Parse a descriptor string.
bilingual_str TransactionErrorString(const TransactionError err)
const std::string CURRENCY_ATOM
const std::string CURRENCY_UNIT
@ SAT_VB
Use sat/vB fee rate unit.
@ SIGHASH_DEFAULT
Taproot only; implied when sighash byte is missing, and equivalent to SIGHASH_ALL.
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg, std::vector< int > *error_locations)
std::string EncodeDestination(const CTxDestination &dest)
bilingual_str ErrorString(const Result< T > &result)
Result CommitTransaction(CWallet &wallet, const uint256 &txid, CMutableTransaction &&mtx, std::vector< bilingual_str > &errors, uint256 &bumped_txid)
Commit the bumpfee transaction.
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)
Create bumpfee transaction based on feerate estimates.
bool SignTransaction(CWallet &wallet, CMutableTransaction &mtx)
Sign the new transaction,.
std::shared_ptr< CWallet > GetWalletForJSONRPCRequest(const JSONRPCRequest &request)
Figures out what wallet, if any, to use for a JSONRPCRequest.
std::map< std::string, std::string > mapValue_t
static RPCHelpMan bumpfee_helper(std::string method_name)
RPCHelpMan walletprocesspsbt()
void EnsureWalletIsUnlocked(const CWallet &wallet)
const std::string HELP_REQUIRING_PASSPHRASE
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.
RPCHelpMan walletcreatefundedpsbt()
static void InterpretFeeEstimationInstructions(const UniValue &conf_target, const UniValue &estimate_mode, const UniValue &fee_rate, UniValue &options)
static void SetOptionsInputWeights(const UniValue &inputs, UniValue &options)
util::Result< CreatedTransactionResult > CreateTransaction(CWallet &wallet, const std::vector< CRecipient > &vecSend, 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...
RPCHelpMan signrawtransactionwithwallet()
CFeeRate GetMinimumFeeRate(const CWallet &wallet, const CCoinControl &coin_control, FeeCalculation *feeCalc)
Estimate the minimum fee rate considering user set parameters and the required fee.
UniValue SendMoney(CWallet &wallet, const CCoinControl &coin_control, std::vector< CRecipient > &recipients, mapValue_t map_value, bool verbose)
static void PreventOutdatedOptions(const UniValue &options)
static UniValue FinishTransaction(const std::shared_ptr< CWallet > pwallet, const UniValue &options, const CMutableTransaction &rawTx)
bool ParseIncludeWatchonly(const UniValue &include_watchonly, const CWallet &wallet)
Used by RPC commands that have an include_watchonly parameter.
void FundTransaction(CWallet &wallet, CMutableTransaction &tx, CAmount &fee_out, int &change_position, const UniValue &options, CCoinControl &coinControl, bool override_min_fee)
bool GetAvoidReuseFlag(const CWallet &wallet, const UniValue ¶m)
RPCHelpMan fundrawtransaction()
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...
static std::vector< RPCArg > FundTxDoc(bool solving_data=true)
@ WALLET_FLAG_EXTERNAL_SIGNER
Indicates that the wallet needs an external signer.
@ WALLET_FLAG_DISABLE_PRIVATE_KEYS
static void ParseRecipients(const UniValue &address_amounts, const UniValue &subtract_fee_outputs, std::vector< CRecipient > &recipients)
RPCHelpMan sendtoaddress()
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::optional< OutputType > ParseOutputType(const std::string &type)
bool IsDust(const CTxOut &txout, const CFeeRate &dustRelayFeeIn)
static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE
Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or rep...
static constexpr unsigned int MAX_STANDARD_TX_WEIGHT
The maximum weight for transactions we're willing to relay/mine.
static CTransactionRef MakeTransactionRef(Tx &&txIn)
std::shared_ptr< const CTransaction > CTransactionRef
bool DecodeBase64PSBT(PartiallySignedTransaction &psbt, const std::string &base64_tx, std::string &error)
Decode a base64ed PSBT into a PartiallySignedTransaction.
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)
CMutableTransaction ConstructTransaction(const UniValue &inputs_in, const UniValue &outputs_in, const UniValue &locktime, std::optional< bool > rbf)
Create a transaction from univalue parameters.
void ParsePrevouts(const UniValue &prevTxsUnival, FillableSigningProvider *keystore, std::map< COutPoint, Coin > &coins)
Parse a prevtxs UniValue array and get the map of coins from it.
UniValue JSONRPCError(int code, const std::string &message)
@ RPC_MISC_ERROR
General application defined errors.
@ RPC_WALLET_INSUFFICIENT_FUNDS
Not enough funds in wallet or account.
@ RPC_INVALID_PARAMETER
Invalid, missing or duplicate parameter.
@ RPC_WALLET_ERROR
Wallet errors.
@ RPC_DESERIALIZATION_ERROR
Error parsing or validating structure in raw format.
@ RPC_INVALID_REQUEST
Standard JSON-RPC 2.0 errors.
@ RPC_INVALID_ADDRESS_OR_KEY
Invalid address or key.
std::string HelpExampleCli(const std::string &methodname, const std::string &args)
UniValue JSONRPCTransactionError(TransactionError terr, const std::string &err_string)
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
uint256 ParseHashO(const UniValue &o, std::string strKey)
uint256 ParseHashV(const UniValue &v, std::string strName)
Utilities: convert hex-encoded Values (throws error if not hex).
const std::string EXAMPLE_ADDRESS[2]
Example bech32 addresses for the RPCExamples help documentation.
unsigned int ParseConfirmTarget(const UniValue &value, unsigned int max_target)
Parse a confirm target option and raise an RPC error if it is invalid.
void RPCTypeCheckObj(const UniValue &o, const std::map< std::string, UniValueType > &typesExpected, bool fAllowNull, bool fStrict)
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a standard scriptPubKey for the destination address.
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination is a CNoDestination.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
std::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
A mutable version of CTransaction.
std::vector< CTxOut > vout
FlatSigningProvider & Merge(FlatSigningProvider &&b) LIFETIMEBOUND
std::map< CKeyID, CPubKey > pubkeys
std::map< CScriptID, CScript > scripts
A version of CTransaction with the PSBT format.
@ OBJ_USER_KEYS
Special type where the user must set the keys e.g. to define multiple addresses; as opposed to e....
@ STR_HEX
Special type that is a STR with only hex chars.
@ AMOUNT
Special type representing a floating point amount (can be either NUM or STR)
std::string DefaultHint
Hint for default value.
@ OMITTED
Optional argument for which the default value is omitted from help text for one of two reasons:
std::string oneline_description
Should be empty unless it is supposed to override the auto-generated summary line.
@ STR_HEX
Special string with only hex chars.
@ STR_AMOUNT
Special string to represent a floating point amount.
Wrapper for UniValue::VType, which includes typeAny: Used to denote don't care type.
A UTXO under consideration for use in funding a new transaction.
bool error(const char *fmt, const Args &... args)
const UniValue & find_value(const UniValue &obj, const std::string &name)
const UniValue NullUniValue
std::string FeeModes(const std::string &delimiter)
bool FeeModeFromString(const std::string &mode_string, FeeEstimateMode &fee_estimate_mode)
const std::string InvalidEstimateModeErrorMessage()
std::string StringForFeeReason(FeeReason reason)
static constexpr uint32_t MAX_BIP125_RBF_SEQUENCE
std::vector< Byte > ParseHex(std::string_view str)
Parse the hex string into bytes (uint8_t or std::byte).
std::string EncodeBase64(Span< const unsigned char > input)
bool IsHex(std::string_view str)
V Cat(V v1, V &&v2)
Concatenate two vectors, moving elements.
static const int PROTOCOL_VERSION
network protocol versioning