Skip to content

Commit 04670ef

Browse files
committed
Merge #20385: test: run mempool_spend_coinbase.py even with wallet disabled
21f2433 test: run mempool_spend_coinbase.py even with wallet disabled (Michael Dietz) Pull request description: Run the mempool spend coinbase test even when the wallet was not compiled, as proposed in #20078. ACKs for top commit: laanwj: ACK 21f2433 Tree-SHA512: 301582c04376371cfa8f1ebb2418a4341b42ddcd9ad4f48b58bcf888d867a97bdc409972856b67a8339ac5e60124aefee82a049b4f7fc6bca7a18d7e92e090be
2 parents 848d665 + 21f2433 commit 04670ef

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

test/functional/mempool_spend_coinbase.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,44 +13,48 @@
1313
"""
1414

1515
from test_framework.test_framework import BitcoinTestFramework
16-
from test_framework.blocktools import create_raw_transaction
1716
from test_framework.util import assert_equal, assert_raises_rpc_error
17+
from test_framework.wallet import MiniWallet
1818

1919

2020
class MempoolSpendCoinbaseTest(BitcoinTestFramework):
2121
def set_test_params(self):
2222
self.num_nodes = 1
23-
24-
def skip_test_if_missing_module(self):
25-
self.skip_if_no_wallet()
23+
self.setup_clean_chain = True
2624

2725
def run_test(self):
26+
wallet = MiniWallet(self.nodes[0])
27+
28+
wallet.generate(200)
2829
chain_height = self.nodes[0].getblockcount()
2930
assert_equal(chain_height, 200)
30-
node0_address = self.nodes[0].getnewaddress()
3131

3232
# Coinbase at height chain_height-100+1 ok in mempool, should
3333
# get mined. Coinbase at height chain_height-100+2 is
34-
# is too immature to spend.
34+
# too immature to spend.
3535
b = [self.nodes[0].getblockhash(n) for n in range(101, 103)]
3636
coinbase_txids = [self.nodes[0].getblock(h)['tx'][0] for h in b]
37-
spends_raw = [create_raw_transaction(self.nodes[0], txid, node0_address, amount=49.99) for txid in coinbase_txids]
37+
utxo_101 = wallet.get_utxo(txid=coinbase_txids[0])
38+
utxo_102 = wallet.get_utxo(txid=coinbase_txids[1])
3839

39-
spend_101_id = self.nodes[0].sendrawtransaction(spends_raw[0])
40+
spend_101_id = wallet.send_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_101)["txid"]
4041

4142
# coinbase at height 102 should be too immature to spend
42-
assert_raises_rpc_error(-26,"bad-txns-premature-spend-of-coinbase", self.nodes[0].sendrawtransaction, spends_raw[1])
43+
assert_raises_rpc_error(-26,
44+
"bad-txns-premature-spend-of-coinbase",
45+
lambda: wallet.send_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_102))
4346

4447
# mempool should have just spend_101:
45-
assert_equal(self.nodes[0].getrawmempool(), [ spend_101_id ])
48+
assert_equal(self.nodes[0].getrawmempool(), [spend_101_id])
4649

4750
# mine a block, spend_101 should get confirmed
4851
self.nodes[0].generate(1)
4952
assert_equal(set(self.nodes[0].getrawmempool()), set())
5053

5154
# ... and now height 102 can be spent:
52-
spend_102_id = self.nodes[0].sendrawtransaction(spends_raw[1])
53-
assert_equal(self.nodes[0].getrawmempool(), [ spend_102_id ])
55+
spend_102_id = wallet.send_self_transfer(from_node=self.nodes[0], utxo_to_spend=utxo_102)["txid"]
56+
assert_equal(self.nodes[0].getrawmempool(), [spend_102_id])
57+
5458

5559
if __name__ == '__main__':
5660
MempoolSpendCoinbaseTest().main()

test/functional/test_framework/wallet.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,20 @@ def generate(self, num_blocks):
4040
self._utxos.append({'txid': cb_tx['txid'], 'vout': 0, 'value': cb_tx['vout'][0]['value']})
4141
return blocks
4242

43-
def get_utxo(self):
44-
"""Return the last utxo. Can be used to get the change output immediately after a send_self_transfer"""
45-
return self._utxos.pop()
43+
def get_utxo(self, *, txid=''):
44+
"""
45+
Returns a utxo and marks it as spent (pops it from the internal list)
46+
47+
Args:
48+
txid (string), optional: get the first utxo we find from a specific transaction
49+
50+
Note: Can be used to get the change output immediately after a send_self_transfer
51+
"""
52+
index = -1 # by default the last utxo
53+
if txid:
54+
utxo = next(filter(lambda utxo: txid == utxo['txid'], self._utxos))
55+
index = self._utxos.index(utxo)
56+
return self._utxos.pop(index)
4657

4758
def send_self_transfer(self, *, fee_rate=Decimal("0.003"), from_node, utxo_to_spend=None):
4859
"""Create and send a tx with the specified fee_rate. Fee may be exact or at most one satoshi higher than needed."""

0 commit comments

Comments
 (0)