Skip to content

Commit b0a7a76

Browse files
committed
Merge #16873: rpc: fix regression in gettransaction
1b41c2c test: improve gettransaction test coverage (Jon Atack) 0f34f54 rpc: fix regression in gettransaction (Jon Atack) Pull request description: Closes #16872. PR #16866 renamed the `decode` argument in gettransaction to `verbose` to make it more consistent with other RPC calls like getrawtransaction. However, it inadvertently overloaded the "details" field when `verbose` is passed. The result is that the original "details" field is no longer returned correctly, which seems to be a breaking API change. This PR: - takes the simplest path to restoring the "details" field by renaming the decoded one back to "decoded" while leaving the `verbose` argument for API consistency, which was the main intent of #16866, - addresses [this comment](bitcoin/bitcoin#16185 (comment)) by mentioning in the RPC help that the new decoded field is equivalent to decoderawtransaction, and - updates the help, functional test, and release note. Reviewers, to test this manually, build and run `bitcoin-cli help gettransaction` and `bitcoin-cli gettransaction <wallet txid> false true`, and verify that the command returns both `details` and `decoded` fields. ACKs for top commit: jnewbery: tACK 1b41c2c Tree-SHA512: 287edd5db7ed58fe8b548975aba58628bd45ed708b28f40174f10a35a455d89f796fbf27430aa881fc376f47aabda8803f74d4d100683bd86577a02279091cf3
2 parents a40ccbb + 1b41c2c commit b0a7a76

File tree

3 files changed

+41
-10
lines changed

3 files changed

+41
-10
lines changed

doc/release-notes-16185.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
RPC changes
22
-----------
3-
The `gettransaction` RPC now accepts a third (boolean) argument `verbose`. If set to `true`, a new `details` field will be added to the response containing additional transaction details.
3+
The `gettransaction` RPC now accepts a third (boolean) argument `verbose`. If
4+
set to `true`, a new `decoded` field will be added to the response containing
5+
the decoded transaction. This field is equivalent to RPC `decoderawtransaction`,
6+
or RPC `getrawtransaction` when `verbose` is passed.

src/wallet/rpcwallet.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,8 +1648,10 @@ static UniValue gettransaction(const JSONRPCRequest& request)
16481648
"\nGet detailed information about in-wallet transaction <txid>\n",
16491649
{
16501650
{"txid", RPCArg::Type::STR, RPCArg::Optional::NO, "The transaction id"},
1651-
{"include_watchonly", RPCArg::Type::BOOL, /* default */ "true for watch-only wallets, otherwise false", "Whether to include watch-only addresses in balance calculation and details[]"},
1652-
{"verbose", RPCArg::Type::BOOL, /* default */ "false", "Whether to add a field with additional transaction details"},
1651+
{"include_watchonly", RPCArg::Type::BOOL, /* default */ "true for watch-only wallets, otherwise false",
1652+
"Whether to include watch-only addresses in balance calculation and details[]"},
1653+
{"verbose", RPCArg::Type::BOOL, /* default */ "false",
1654+
"Whether to include a `decoded` field containing the decoded transaction (equivalent to RPC decoderawtransaction)"},
16531655
},
16541656
RPCResult{
16551657
"{\n"
@@ -1685,7 +1687,8 @@ static UniValue gettransaction(const JSONRPCRequest& request)
16851687
" ,...\n"
16861688
" ],\n"
16871689
" \"hex\" : \"data\" (string) Raw data for transaction\n"
1688-
" \"details\" : transaction (json object) Optional, additional transaction details. This object contains the same transaction details as the `getrawtransaction` RPC method\n"
1690+
" \"decoded\" : transaction (json object) Optional, the decoded transaction (only present when `verbose` is passed), equivalent to the\n"
1691+
" RPC decoderawtransaction method, or the RPC getrawtransaction method when `verbose` is passed.\n"
16891692
"}\n"
16901693
},
16911694
RPCExamples{
@@ -1739,9 +1742,9 @@ static UniValue gettransaction(const JSONRPCRequest& request)
17391742
entry.pushKV("hex", strHex);
17401743

17411744
if (verbose) {
1742-
UniValue details(UniValue::VOBJ);
1743-
TxToUniv(*wtx.tx, uint256(), details, false);
1744-
entry.pushKV("details", details);
1745+
UniValue decoded(UniValue::VOBJ);
1746+
TxToUniv(*wtx.tx, uint256(), decoded, false);
1747+
entry.pushKV("decoded", decoded);
17451748
}
17461749

17471750
return entry;

test/functional/wallet_basic.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -499,10 +499,35 @@ def run_test(self):
499499
self.nodes[0].setlabel(change, 'foobar')
500500
assert_equal(self.nodes[0].getaddressinfo(change)['ischange'], False)
501501

502-
# Test "verbose" field value in gettransaction response
503-
self.log.info("Testing verbose gettransaction...")
502+
# Test gettransaction response with different arguments.
503+
self.log.info("Testing gettransaction response with different arguments...")
504+
self.nodes[0].setlabel(change, 'baz')
505+
baz = self.nodes[0].listtransactions(label="baz", count=1)[0]
506+
expected_receive_vout = {"label": "baz",
507+
"address": baz["address"],
508+
"amount": baz["amount"],
509+
"category": baz["category"],
510+
"vout": baz["vout"]}
511+
expected_fields = frozenset({'amount', 'bip125-replaceable', 'confirmations', 'details', 'fee',
512+
'hex', 'time', 'timereceived', 'trusted', 'txid', 'walletconflicts'})
513+
verbose_field = "decoded"
514+
expected_verbose_fields = expected_fields | {verbose_field}
515+
516+
self.log.debug("Testing gettransaction response without verbose")
517+
tx = self.nodes[0].gettransaction(txid=txid)
518+
assert_equal(set([*tx]), expected_fields)
519+
assert_array_result(tx["details"], {"category": "receive"}, expected_receive_vout)
520+
521+
self.log.debug("Testing gettransaction response with verbose set to False")
522+
tx = self.nodes[0].gettransaction(txid=txid, verbose=False)
523+
assert_equal(set([*tx]), expected_fields)
524+
assert_array_result(tx["details"], {"category": "receive"}, expected_receive_vout)
525+
526+
self.log.debug("Testing gettransaction response with verbose set to True")
504527
tx = self.nodes[0].gettransaction(txid=txid, verbose=True)
505-
assert_equal(tx["details"], self.nodes[0].decoderawtransaction(tx["hex"]))
528+
assert_equal(set([*tx]), expected_verbose_fields)
529+
assert_array_result(tx["details"], {"category": "receive"}, expected_receive_vout)
530+
assert_equal(tx[verbose_field], self.nodes[0].decoderawtransaction(tx["hex"]))
506531

507532

508533
if __name__ == '__main__':

0 commit comments

Comments
 (0)