Skip to content

Commit ff0eac0

Browse files
committed
Merge bitcoin/bitcoin#29283: test: ensure output is large enough to pay for its fees
3bfc5bd test: ensure output is large enough to pay for its fees (stickies-v) Pull request description: Fixes a (rare) intermittency issue in wallet_import_rescan.py Since we [use](https://github.com/bitcoin/bitcoin/blob/03752444cd54df05a731557968d5a9f33a55c55c/test/functional/wallet_import_rescan.py#L296) `subtract_fee_from_outputs=[0]` in the `send` command, the output amount must at least be as large as the fee we're paying. Example in CI: https://api.cirrus-ci.com/v1/task/6107972259020800/logs/ci.log ``` 2024-01-18T22:16:12.383000Z TestFramework (INFO): Test that the mempool is rescanned as well if the rescan parameter is set to true 2024-01-18T22:16:20.187000Z TestFramework (ERROR): JSONRPC error Traceback (most recent call last): File "/ci_container_base/ci/scratch/build/bitcoin-x86_64-pc-linux-gnu/test/functional/test_framework/test_framework.py", line 131, in main self.run_test() File "/ci_container_base/ci/scratch/build/bitcoin-x86_64-pc-linux-gnu/test/functional/wallet_import_rescan.py", line 292, in run_test child = self.nodes[1].send( File "/ci_container_base/ci/scratch/build/bitcoin-x86_64-pc-linux-gnu/test/functional/test_framework/coverage.py", line 50, in __call__ return_val = self.auth_service_proxy_instance.__call__(*args, **kwargs) File "/ci_container_base/ci/scratch/build/bitcoin-x86_64-pc-linux-gnu/test/functional/test_framework/authproxy.py", line 129, in __call__ raise JSONRPCException(response['error'], status) test_framework.authproxy.JSONRPCException: The transaction amount is too small to pay the fee (-4) ``` Can be reproduced locally by forcing usage of the lowest possible value produced by `get_rand_amount()` ([thanks furszy](bitcoin/bitcoin#29283 (review))): <details> <summary>git diff on 5f3a057</summary> ```diff diff --git a/test/functional/wallet_import_rescan.py b/test/functional/wallet_import_rescan.py index 7f01d23..925849d5c0 100755 --- a/test/functional/wallet_import_rescan.py +++ b/test/functional/wallet_import_rescan.py @@ -270,7 +270,7 @@ class ImportRescanTest(BitcoinTestFramework): address_type=variant.address_type.value, )) variant.key = self.nodes[1].dumpprivkey(variant.address["address"]) - variant.initial_amount = get_rand_amount() * 2 + variant.initial_amount = Decimal(str(round(AMOUNT_DUST, 8))) * 2 variant.initial_txid = self.nodes[0].sendtoaddress(variant.address["address"], variant.initial_amount) variant.confirmation_height = 0 variant.timestamp = timestamp ``` </details> ACKs for top commit: achow101: ACK 3bfc5bd glozow: utACK 3bfc5bd, didn't experience this issue but in theory a minimum of `AMOUNT_DUST` could be too low to pay the fees furszy: utACK 3bfc5bd Tree-SHA512: 821ab94a510772e90528b2cef368bbf70309d8fd1dcda53dce75dd1bf91622358e80fea4d9fc68249b9d598892306c66f6c843b4a6855a9f9a9175f7b41109c6
2 parents fa2bcf6 + 3bfc5bd commit ff0eac0

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

test/functional/wallet_import_rescan.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
AddressType,
2525
ADDRESS_BCRT1_UNSPENDABLE,
2626
)
27+
from test_framework.messages import COIN
2728
from test_framework.util import (
2829
assert_equal,
2930
set_node_times,
@@ -270,7 +271,9 @@ def run_test(self):
270271
address_type=variant.address_type.value,
271272
))
272273
variant.key = self.nodes[1].dumpprivkey(variant.address["address"])
273-
variant.initial_amount = get_rand_amount() * 2
274+
# Ensure output is large enough to pay for fees: conservatively assuming txsize of
275+
# 500 vbytes and feerate of 20 sats/vbytes
276+
variant.initial_amount = max(get_rand_amount(), (500 * 20 / COIN) + AMOUNT_DUST)
274277
variant.initial_txid = self.nodes[0].sendtoaddress(variant.address["address"], variant.initial_amount)
275278
variant.confirmation_height = 0
276279
variant.timestamp = timestamp

0 commit comments

Comments
 (0)