Skip to content

Commit d813d26

Browse files
committed
[rpc] send: various touch-ups
1 parent 0fc1c68 commit d813d26

File tree

2 files changed

+23
-24
lines changed

2 files changed

+23
-24
lines changed

src/wallet/rpcwallet.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2968,7 +2968,7 @@ void FundTransaction(CWallet* const pwallet, CMutableTransaction& tx, CAmount& f
29682968
{"lockUnspents", UniValueType(UniValue::VBOOL)},
29692969
{"lock_unspents", UniValueType(UniValue::VBOOL)},
29702970
{"locktime", UniValueType(UniValue::VNUM)},
2971-
{"feeRate", UniValueType()}, // will be checked below,
2971+
{"feeRate", UniValueType()}, // will be checked below
29722972
{"psbt", UniValueType(UniValue::VBOOL)},
29732973
{"subtractFeeFromOutputs", UniValueType(UniValue::VARR)},
29742974
{"subtract_fee_from_outputs", UniValueType(UniValue::VARR)},
@@ -3877,7 +3877,7 @@ static RPCHelpMan send()
38773877
"\nEXPERIMENTAL warning: this call may be changed in future releases.\n"
38783878
"\nSend a transaction.\n",
38793879
{
3880-
{"outputs", RPCArg::Type::ARR, RPCArg::Optional::NO, "a json array with outputs (key-value pairs), where none of the keys are duplicated.\n"
3880+
{"outputs", RPCArg::Type::ARR, RPCArg::Optional::NO, "A JSON array with outputs (key-value pairs), where none of the keys are duplicated.\n"
38813881
"That is, each address can only appear once and there can only be one 'data' object.\n"
38823882
"For convenience, a dictionary, which holds the key-value pairs directly, is also accepted.",
38833883
{
@@ -3909,7 +3909,7 @@ static RPCHelpMan send()
39093909
{"include_watching", RPCArg::Type::BOOL, /* default */ "true for watch-only wallets, otherwise false", "Also select inputs which are watch only.\n"
39103910
"Only solvable inputs can be used. Watch-only destinations are solvable if the public key and/or output script was imported,\n"
39113911
"e.g. with 'importpubkey' or 'importmulti' with the 'pubkeys' or 'desc' field."},
3912-
{"inputs", RPCArg::Type::ARR, /* default */ "empty array", "Specify inputs instead of adding them automatically. A json array of json objects",
3912+
{"inputs", RPCArg::Type::ARR, /* default */ "empty array", "Specify inputs instead of adding them automatically. A JSON array of JSON objects",
39133913
{
39143914
{"txid", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The transaction id"},
39153915
{"vout", RPCArg::Type::NUM, RPCArg::Optional::NO, "The output number"},
@@ -3919,7 +3919,7 @@ static RPCHelpMan send()
39193919
{"locktime", RPCArg::Type::NUM, /* default */ "0", "Raw locktime. Non-0 value also locktime-activates inputs"},
39203920
{"lock_unspents", RPCArg::Type::BOOL, /* default */ "false", "Lock selected unspent outputs"},
39213921
{"psbt", RPCArg::Type::BOOL, /* default */ "automatic", "Always return a PSBT, implies add_to_wallet=false."},
3922-
{"subtract_fee_from_outputs", RPCArg::Type::ARR, /* default */ "empty array", "A json array of integers.\n"
3922+
{"subtract_fee_from_outputs", RPCArg::Type::ARR, /* default */ "empty array", "A JSON array of integers.\n"
39233923
"The fee will be equally deducted from the amount of each specified output.\n"
39243924
"Those recipients will receive less bitcoins than you enter in their corresponding amount field.\n"
39253925
"If no outputs are specified here, the sender pays the fee.",
@@ -3943,8 +3943,8 @@ static RPCHelpMan send()
39433943
},
39443944
RPCExamples{""
39453945
"\nSend with a fee rate of 1 satoshi per byte\n"
3946-
+ HelpExampleCli("send", "'{\"" + EXAMPLE_ADDRESS[0] + "\": 0.1}' 1 sat/b\n" +
3947-
"\nCreate 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")
3946+
+ HelpExampleCli("send", "'{\"" + EXAMPLE_ADDRESS[0] + "\": 0.1}' 1 sat/b\n") +
3947+
"\nCreate 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"
39483948
+ HelpExampleCli("send", "'{\"" + EXAMPLE_ADDRESS[0] + "\": 0.1}' 1 economical '{\"add_to_wallet\": false, \"inputs\": [{\"txid\":\"a08e6907dbbd3d809776dbfc5d82e371b764ed838b5655e72f463568df1aadf0\", \"vout\":1}]}'")
39493949
},
39503950
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
@@ -4012,7 +4012,7 @@ static RPCHelpMan send()
40124012
// Make a blank psbt
40134013
PartiallySignedTransaction psbtx(rawTx);
40144014

4015-
// Fill transaction with out data and sign
4015+
// Fill transaction with our data and sign
40164016
bool complete = true;
40174017
const TransactionError err = pwallet->FillPSBT(psbtx, complete, SIGHASH_ALL, true, false);
40184018
if (err != TransactionError::OK) {
@@ -4024,13 +4024,11 @@ static RPCHelpMan send()
40244024

40254025
UniValue result(UniValue::VOBJ);
40264026

4027-
// Serialize the PSBT
4028-
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
4029-
ssTx << psbtx;
4030-
const std::string result_str = EncodeBase64(ssTx.str());
4031-
40324027
if (psbt_opt_in || !complete || !add_to_wallet) {
4033-
result.pushKV("psbt", result_str);
4028+
// Serialize the PSBT
4029+
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
4030+
ssTx << psbtx;
4031+
result.pushKV("psbt", EncodeBase64(ssTx.str()));
40344032
}
40354033

40364034
if (complete) {

test/functional/wallet_send.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ def skip_test_if_missing_module(self):
2929

3030
def test_send(self, from_wallet, to_wallet=None, amount=None, data=None,
3131
arg_conf_target=None, arg_estimate_mode=None,
32-
conf_target=None, estimate_mode=None, add_to_wallet=None,psbt=None,
33-
inputs=None,add_inputs=None,change_address=None,change_position=None,change_type=None,
34-
include_watching=None,locktime=None,lock_unspents=None,replaceable=None,subtract_fee_from_outputs=None,
32+
conf_target=None, estimate_mode=None, add_to_wallet=None, psbt=None,
33+
inputs=None, add_inputs=None, change_address=None, change_position=None, change_type=None,
34+
include_watching=None, locktime=None, lock_unspents=None, replaceable=None, subtract_fee_from_outputs=None,
3535
expect_error=None):
3636
assert (amount is None) != (data is None)
3737

@@ -92,13 +92,13 @@ def test_send(self, from_wallet, to_wallet=None, amount=None, data=None,
9292
res = from_wallet.send(outputs=outputs, conf_target=arg_conf_target, estimate_mode=arg_estimate_mode, options=options)
9393
else:
9494
try:
95-
assert_raises_rpc_error(expect_error[0],expect_error[1],from_wallet.send,
96-
outputs=outputs,conf_target=arg_conf_target,estimate_mode=arg_estimate_mode,options=options)
95+
assert_raises_rpc_error(expect_error[0], expect_error[1], from_wallet.send,
96+
outputs=outputs, conf_target=arg_conf_target, estimate_mode=arg_estimate_mode, options=options)
9797
except AssertionError:
9898
# Provide debug info if the test fails
9999
self.log.error("Unexpected successful result:")
100100
self.log.error(options)
101-
res = from_wallet.send(outputs=outputs,conf_target=arg_conf_target,estimate_mode=arg_estimate_mode,options=options)
101+
res = from_wallet.send(outputs=outputs, conf_target=arg_conf_target, estimate_mode=arg_estimate_mode, options=options)
102102
self.log.error(res)
103103
if "txid" in res and add_to_wallet:
104104
self.log.error("Transaction details:")
@@ -131,7 +131,7 @@ def test_send(self, from_wallet, to_wallet=None, amount=None, data=None,
131131
assert tx
132132
assert_equal(tx["bip125-replaceable"], "yes" if replaceable else "no")
133133
# Ensure transaction exists in the mempool:
134-
tx = from_wallet.getrawtransaction(res["txid"],True)
134+
tx = from_wallet.getrawtransaction(res["txid"], True)
135135
assert tx
136136
if amount:
137137
if subtract_fee_from_outputs:
@@ -164,7 +164,7 @@ def run_test(self):
164164
self.nodes[1].createwallet(wallet_name="w2")
165165
w2 = self.nodes[1].get_wallet_rpc("w2")
166166
# w3 is a watch-only wallet, based on w2
167-
self.nodes[1].createwallet(wallet_name="w3",disable_private_keys=True)
167+
self.nodes[1].createwallet(wallet_name="w3", disable_private_keys=True)
168168
w3 = self.nodes[1].get_wallet_rpc("w3")
169169
for _ in range(3):
170170
a2_receive = w2.getnewaddress()
@@ -188,7 +188,7 @@ def run_test(self):
188188
self.sync_blocks()
189189

190190
# w4 has private keys enabled, but only contains watch-only keys (from w2)
191-
self.nodes[1].createwallet(wallet_name="w4",disable_private_keys=False)
191+
self.nodes[1].createwallet(wallet_name="w4", disable_private_keys=False)
192192
w4 = self.nodes[1].get_wallet_rpc("w4")
193193
for _ in range(3):
194194
a2_receive = w2.getnewaddress()
@@ -253,7 +253,7 @@ def run_test(self):
253253
self.test_send(from_wallet=w0, to_wallet=w1, amount=1, conf_target=-1, estimate_mode="sat/b",
254254
expect_error=(-3, "Amount out of range"))
255255
# Fee rate of 0.1 satoshi per byte should throw an error
256-
# TODO: error should say 1.000 sat/b
256+
# TODO: error should use sat/b
257257
self.test_send(from_wallet=w0, to_wallet=w1, amount=1, conf_target=0.1, estimate_mode="sat/b",
258258
expect_error=(-4, "Fee rate (0.00000100 BTC/kB) is lower than the minimum fee rate setting (0.00001000 BTC/kB)"))
259259

@@ -325,7 +325,8 @@ def run_test(self):
325325
locked_coins = w0.listlockunspent()
326326
assert_equal(len(locked_coins), 1)
327327
# Locked coins are automatically unlocked when manually selected
328-
self.test_send(from_wallet=w0, to_wallet=w1, amount=1, inputs=[utxo1],add_to_wallet=False)
328+
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, inputs=[utxo1], add_to_wallet=False)
329+
assert res["complete"]
329330

330331
self.log.info("Replaceable...")
331332
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, add_to_wallet=True, replaceable=True)

0 commit comments

Comments
 (0)