Merge #14653: rpcwallet: Add missing transaction categories to rpc helptexts
f3f6dde56e
Test coinbase category in wallet rpcs (andrewtoth)e982f0b682
Add all category options to wallet rpc help (andrewtoth) Pull request description: The current helptext for `listtransactions`, `listsinceblock` and `gettransaction` only list two of the five possible options for `category`. This incorrectly implies that these are the only two options, and can cause problems if the other three options aren't accounted for. Also, some of the documentation is incorrect when specifying which options are returned for which categories. This PR updates the helptext for these RPCs and adds a functional regression test for the cases when the other three categories are returned. Tree-SHA512: 67dd7ff6269a3b0f17f5d1a61b0ae1fb1f3778f05e1c440bfbb9b3a005c9c6d740abcace20f3d597cf2bd6779c494448690f13fab0bd2340f206213bc7890b51
This commit is contained in:
commit
86e0a33f5c
3 changed files with 87 additions and 12 deletions
|
@ -1397,9 +1397,14 @@ UniValue listtransactions(const JSONRPCRequest& request)
|
||||||
"[\n"
|
"[\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"address\":\"address\", (string) The bitcoin address of the transaction.\n"
|
" \"address\":\"address\", (string) The bitcoin address of the transaction.\n"
|
||||||
" \"category\":\"send|receive\", (string) The transaction category.\n"
|
" \"category\": (string) The transaction category.\n"
|
||||||
|
" \"send\" Transactions sent.\n"
|
||||||
|
" \"receive\" Non-coinbase transactions received.\n"
|
||||||
|
" \"generate\" Coinbase transactions received with more than 100 confirmations.\n"
|
||||||
|
" \"immature\" Coinbase transactions received with 100 or fewer confirmations.\n"
|
||||||
|
" \"orphan\" Orphaned coinbase transactions received.\n"
|
||||||
" \"amount\": x.xxx, (numeric) The amount in " + CURRENCY_UNIT + ". This is negative for the 'send' category, and is positive\n"
|
" \"amount\": x.xxx, (numeric) The amount in " + CURRENCY_UNIT + ". This is negative for the 'send' category, and is positive\n"
|
||||||
" for the 'receive' category,\n"
|
" for all other categories\n"
|
||||||
" \"label\": \"label\", (string) A comment for the address/transaction, if any\n"
|
" \"label\": \"label\", (string) A comment for the address/transaction, if any\n"
|
||||||
" \"vout\": n, (numeric) the vout value\n"
|
" \"vout\": n, (numeric) the vout value\n"
|
||||||
" \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the \n"
|
" \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the \n"
|
||||||
|
@ -1526,20 +1531,25 @@ static UniValue listsinceblock(const JSONRPCRequest& request)
|
||||||
"\nResult:\n"
|
"\nResult:\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" \"transactions\": [\n"
|
" \"transactions\": [\n"
|
||||||
" \"address\":\"address\", (string) The bitcoin address of the transaction. Not present for move transactions (category = move).\n"
|
" \"address\":\"address\", (string) The bitcoin address of the transaction.\n"
|
||||||
" \"category\":\"send|receive\", (string) The transaction category. 'send' has negative amounts, 'receive' has positive amounts.\n"
|
" \"category\": (string) The transaction category.\n"
|
||||||
" \"amount\": x.xxx, (numeric) The amount in " + CURRENCY_UNIT + ". This is negative for the 'send' category, and for the 'move' category for moves \n"
|
" \"send\" Transactions sent.\n"
|
||||||
" outbound. It is positive for the 'receive' category, and for the 'move' category for inbound funds.\n"
|
" \"receive\" Non-coinbase transactions received.\n"
|
||||||
|
" \"generate\" Coinbase transactions received with more than 100 confirmations.\n"
|
||||||
|
" \"immature\" Coinbase transactions received with 100 or fewer confirmations.\n"
|
||||||
|
" \"orphan\" Orphaned coinbase transactions received.\n"
|
||||||
|
" \"amount\": x.xxx, (numeric) The amount in " + CURRENCY_UNIT + ". This is negative for the 'send' category, and is positive\n"
|
||||||
|
" for all other categories\n"
|
||||||
" \"vout\" : n, (numeric) the vout value\n"
|
" \"vout\" : n, (numeric) the vout value\n"
|
||||||
" \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the 'send' category of transactions.\n"
|
" \"fee\": x.xxx, (numeric) The amount of the fee in " + CURRENCY_UNIT + ". This is negative and only available for the 'send' category of transactions.\n"
|
||||||
" \"confirmations\": n, (numeric) The number of confirmations for the transaction. Available for 'send' and 'receive' category of transactions.\n"
|
" \"confirmations\": n, (numeric) The number of confirmations for the transaction.\n"
|
||||||
" When it's < 0, it means the transaction conflicted that many blocks ago.\n"
|
" When it's < 0, it means the transaction conflicted that many blocks ago.\n"
|
||||||
" \"blockhash\": \"hashvalue\", (string) The block hash containing the transaction. Available for 'send' and 'receive' category of transactions.\n"
|
" \"blockhash\": \"hashvalue\", (string) The block hash containing the transaction.\n"
|
||||||
" \"blockindex\": n, (numeric) The index of the transaction in the block that includes it. Available for 'send' and 'receive' category of transactions.\n"
|
" \"blockindex\": n, (numeric) The index of the transaction in the block that includes it.\n"
|
||||||
" \"blocktime\": xxx, (numeric) The block time in seconds since epoch (1 Jan 1970 GMT).\n"
|
" \"blocktime\": xxx, (numeric) The block time in seconds since epoch (1 Jan 1970 GMT).\n"
|
||||||
" \"txid\": \"transactionid\", (string) The transaction id. Available for 'send' and 'receive' category of transactions.\n"
|
" \"txid\": \"transactionid\", (string) The transaction id.\n"
|
||||||
" \"time\": xxx, (numeric) The transaction time in seconds since epoch (Jan 1 1970 GMT).\n"
|
" \"time\": xxx, (numeric) The transaction time in seconds since epoch (Jan 1 1970 GMT).\n"
|
||||||
" \"timereceived\": xxx, (numeric) The time received in seconds since epoch (Jan 1 1970 GMT). Available for 'send' and 'receive' category of transactions.\n"
|
" \"timereceived\": xxx, (numeric) The time received in seconds since epoch (Jan 1 1970 GMT).\n"
|
||||||
" \"bip125-replaceable\": \"yes|no|unknown\", (string) Whether this transaction could be replaced due to BIP125 (replace-by-fee);\n"
|
" \"bip125-replaceable\": \"yes|no|unknown\", (string) Whether this transaction could be replaced due to BIP125 (replace-by-fee);\n"
|
||||||
" may be unknown for unconfirmed transactions not in the mempool\n"
|
" may be unknown for unconfirmed transactions not in the mempool\n"
|
||||||
" \"abandoned\": xxx, (bool) 'true' if the transaction has been abandoned (inputs are respendable). Only available for the 'send' category of transactions.\n"
|
" \"abandoned\": xxx, (bool) 'true' if the transaction has been abandoned (inputs are respendable). Only available for the 'send' category of transactions.\n"
|
||||||
|
@ -1677,7 +1687,12 @@ static UniValue gettransaction(const JSONRPCRequest& request)
|
||||||
" \"details\" : [\n"
|
" \"details\" : [\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
" \"address\" : \"address\", (string) The bitcoin address involved in the transaction\n"
|
" \"address\" : \"address\", (string) The bitcoin address involved in the transaction\n"
|
||||||
" \"category\" : \"send|receive\", (string) The category, either 'send' or 'receive'\n"
|
" \"category\" : (string) The transaction category.\n"
|
||||||
|
" \"send\" Transactions sent.\n"
|
||||||
|
" \"receive\" Non-coinbase transactions received.\n"
|
||||||
|
" \"generate\" Coinbase transactions received with more than 100 confirmations.\n"
|
||||||
|
" \"immature\" Coinbase transactions received with 100 or fewer confirmations.\n"
|
||||||
|
" \"orphan\" Orphaned coinbase transactions received.\n"
|
||||||
" \"amount\" : x.xxx, (numeric) The amount in " + CURRENCY_UNIT + "\n"
|
" \"amount\" : x.xxx, (numeric) The amount in " + CURRENCY_UNIT + "\n"
|
||||||
" \"label\" : \"label\", (string) A comment for the address/transaction, if any\n"
|
" \"label\" : \"label\", (string) A comment for the address/transaction, if any\n"
|
||||||
" \"vout\" : n, (numeric) the vout value\n"
|
" \"vout\" : n, (numeric) the vout value\n"
|
||||||
|
|
|
@ -176,6 +176,7 @@ BASE_SCRIPTS = [
|
||||||
'rpc_getblockstats.py',
|
'rpc_getblockstats.py',
|
||||||
'p2p_fingerprint.py',
|
'p2p_fingerprint.py',
|
||||||
'feature_uacomment.py',
|
'feature_uacomment.py',
|
||||||
|
'wallet_coinbase_category.py',
|
||||||
'feature_filelock.py',
|
'feature_filelock.py',
|
||||||
'p2p_unrequested_blocks.py',
|
'p2p_unrequested_blocks.py',
|
||||||
'feature_includeconf.py',
|
'feature_includeconf.py',
|
||||||
|
|
59
test/functional/wallet_coinbase_category.py
Executable file
59
test/functional/wallet_coinbase_category.py
Executable file
|
@ -0,0 +1,59 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (c) 2014-2018 The Bitcoin Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
"""Test coinbase transactions return the correct categories.
|
||||||
|
|
||||||
|
Tests listtransactions, listsinceblock, and gettransaction.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
from test_framework.util import (
|
||||||
|
assert_array_result
|
||||||
|
)
|
||||||
|
|
||||||
|
class CoinbaseCategoryTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
|
self.num_nodes = 1
|
||||||
|
|
||||||
|
def skip_test_if_missing_module(self):
|
||||||
|
self.skip_if_no_wallet()
|
||||||
|
|
||||||
|
def assert_category(self, category, address, txid, skip):
|
||||||
|
assert_array_result(self.nodes[0].listtransactions(skip=skip),
|
||||||
|
{"address": address},
|
||||||
|
{"category": category})
|
||||||
|
assert_array_result(self.nodes[0].listsinceblock()["transactions"],
|
||||||
|
{"address": address},
|
||||||
|
{"category": category})
|
||||||
|
assert_array_result(self.nodes[0].gettransaction(txid)["details"],
|
||||||
|
{"address": address},
|
||||||
|
{"category": category})
|
||||||
|
|
||||||
|
def run_test(self):
|
||||||
|
# Generate one block to an address
|
||||||
|
address = self.nodes[0].getnewaddress()
|
||||||
|
self.nodes[0].generatetoaddress(1, address)
|
||||||
|
hash = self.nodes[0].getbestblockhash()
|
||||||
|
txid = self.nodes[0].getblock(hash)["tx"][0]
|
||||||
|
|
||||||
|
# Coinbase transaction is immature after 1 confirmation
|
||||||
|
self.assert_category("immature", address, txid, 0)
|
||||||
|
|
||||||
|
# Mine another 99 blocks on top
|
||||||
|
self.nodes[0].generate(99)
|
||||||
|
# Coinbase transaction is still immature after 100 confirmations
|
||||||
|
self.assert_category("immature", address, txid, 99)
|
||||||
|
|
||||||
|
# Mine one more block
|
||||||
|
self.nodes[0].generate(1)
|
||||||
|
# Coinbase transaction is now matured, so category is "generate"
|
||||||
|
self.assert_category("generate", address, txid, 100)
|
||||||
|
|
||||||
|
# Orphan block that paid to address
|
||||||
|
self.nodes[0].invalidateblock(hash)
|
||||||
|
# Coinbase transaction is now orphaned
|
||||||
|
self.assert_category("orphan", address, txid, 100)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
CoinbaseCategoryTest().main()
|
Loading…
Reference in a new issue