Skip to content

Commit c5444b3

Browse files
committed
refactor: add helper for finding collateral vout
1 parent 3ed381b commit c5444b3

File tree

2 files changed

+25
-42
lines changed

2 files changed

+25
-42
lines changed

test/functional/feature_dip3_deterministicmns.py

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from test_framework.blocktools import create_block_with_mnpayments
1414
from test_framework.messages import tx_from_hex
1515
from test_framework.test_framework import (
16+
MASTERNODE_COLLATERAL,
1617
BitcoinTestFramework,
1718
MasternodeInfo,
1819
)
@@ -49,7 +50,7 @@ def start_controller_node(self):
4950

5051
def run_test(self):
5152
self.log.info("funding controller node")
52-
while self.nodes[0].getbalance() < (self.num_initial_mn + 3) * 1000:
53+
while self.nodes[0].getbalance() < (self.num_initial_mn + 3) * MASTERNODE_COLLATERAL:
5354
self.generate(self.nodes[0], 10, sync_fun=self.no_op) # generate enough for collaterals
5455
self.log.info("controller node has {} dash".format(self.nodes[0].getbalance()))
5556

@@ -228,34 +229,17 @@ def prepare_mn(self, node, idx, alias) -> MasternodeInfo:
228229
return mn
229230

230231
def create_mn_collateral(self, node, mn: MasternodeInfo):
231-
txid = node.sendtoaddress(mn.collateral_address, 1000)
232-
vout = None
233-
232+
txid = node.sendtoaddress(mn.collateral_address, mn.get_collateral_value())
234233
self.generate(node, 1, sync_fun=self.no_op)
235-
rawtx = node.getrawtransaction(txid, 1)
236-
for txout in rawtx['vout']:
237-
if txout['value'] == Decimal(1000):
238-
vout = txout['n']
239-
break
240-
assert vout is not None
241-
234+
vout = mn.get_collateral_vout(node, txid)
242235
mn.set_params(collateral_txid=txid, collateral_vout=vout)
243236

244237
# register a protx MN and also fund it (using collateral inside ProRegTx)
245238
def register_fund_mn(self, node, mn: MasternodeInfo):
246-
node.sendtoaddress(mn.fundsAddr, 1000.001)
247-
248-
proTxHash = node.protx('register_fund' if softfork_active(node, 'v19') else 'register_fund_legacy', mn.collateral_address, '127.0.0.1:%d' % mn.nodePort, mn.ownerAddr, mn.pubKeyOperator, mn.votingAddr, mn.operator_reward, mn.rewards_address, mn.fundsAddr)
249-
vout = None
250-
251-
rawtx = node.getrawtransaction(proTxHash, 1)
252-
for txout in rawtx['vout']:
253-
if txout['value'] == Decimal(1000):
254-
vout = txout['n']
255-
break
256-
assert vout is not None
257-
258-
mn.set_params(proTxHash=proTxHash, collateral_txid=proTxHash, collateral_vout=vout)
239+
node.sendtoaddress(mn.fundsAddr, mn.get_collateral_value() + 0.001)
240+
txid = node.protx('register_fund' if softfork_active(node, 'v19') else 'register_fund_legacy', mn.collateral_address, '127.0.0.1:%d' % mn.nodePort, mn.ownerAddr, mn.pubKeyOperator, mn.votingAddr, mn.operator_reward, mn.rewards_address, mn.fundsAddr)
241+
vout = mn.get_collateral_vout(node, txid)
242+
mn.set_params(proTxHash=txid, collateral_txid=txid, collateral_vout=vout)
259243

260244
# create a protx MN which refers to an existing collateral
261245
def register_mn(self, node, mn: MasternodeInfo):
@@ -275,7 +259,7 @@ def start_mn(self, mn: MasternodeInfo):
275259
self.sync_all()
276260

277261
def spend_mn_collateral(self, mn: MasternodeInfo, with_dummy_input_output=False):
278-
return self.spend_input(mn.collateral_txid, mn.collateral_vout, 1000, with_dummy_input_output)
262+
return self.spend_input(mn.collateral_txid, mn.collateral_vout, mn.get_collateral_value(), with_dummy_input_output)
279263

280264
def update_mn_payee(self, mn: MasternodeInfo, payee):
281265
self.nodes[0].sendtoaddress(mn.fundsAddr, 0.001)

test/functional/test_framework/test_framework.py

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,18 @@ def generate_addresses(self, node: TestNode, force_all: bool = False):
11731173
self.pubKeyOperator = bls_ret['public']
11741174
self.keyOperator = bls_ret['secret']
11751175

1176+
def get_collateral_value(self) -> int:
1177+
return EVONODE_COLLATERAL if self.evo else MASTERNODE_COLLATERAL
1178+
1179+
def get_collateral_vout(self, node: TestNode, txid: str, should_assert: bool = True) -> int:
1180+
for txout in node.getrawtransaction(txid, 1)['vout']:
1181+
if txout['value'] == self.get_collateral_value():
1182+
return txout['n']
1183+
if should_assert:
1184+
assert False, f"Unable to find collateral vout from txid {txid}"
1185+
else:
1186+
return -1
1187+
11761188
def __init__(self, evo: bool, legacy: bool):
11771189
self.evo = evo
11781190
self.legacy = legacy
@@ -1370,19 +1382,11 @@ def dynamically_prepare_masternode(self, idx, node_p2p_port, evo=False, rnd=None
13701382
platform_p2p_port = '%d' % (node_p2p_port + 101)
13711383
platform_http_port = '%d' % (node_p2p_port + 102)
13721384

1373-
collateral_amount = EVONODE_COLLATERAL if evo else MASTERNODE_COLLATERAL
1374-
outputs = {mn.collateral_address: collateral_amount, mn.fundsAddr: 1}
1385+
outputs = {mn.collateral_address: mn.get_collateral_value(), mn.fundsAddr: 1}
13751386
collateral_txid = self.nodes[0].sendmany("", outputs)
13761387
self.bump_mocktime(10 * 60 + 1) # to make tx safe to include in block
13771388
mn.bury_tx(self, genIdx=0, txid=collateral_txid, depth=1)
1378-
1379-
rawtx = self.nodes[0].getrawtransaction(collateral_txid, 1)
1380-
collateral_vout = 0
1381-
for txout in rawtx['vout']:
1382-
if txout['value'] == Decimal(collateral_amount):
1383-
collateral_vout = txout['n']
1384-
break
1385-
assert collateral_vout is not None
1389+
collateral_vout = mn.get_collateral_vout(self.nodes[0], collateral_txid)
13861390

13871391
ipAndPort = '127.0.0.1:%d' % node_p2p_port
13881392
operatorReward = idx
@@ -1439,16 +1443,11 @@ def prepare_masternode(self, idx):
14391443
mn = MasternodeInfo(evo=False, legacy=(not softfork_active(self.nodes[0], 'v19')))
14401444
mn.generate_addresses(self.nodes[0])
14411445

1442-
collateral_amount = MASTERNODE_COLLATERAL
1443-
txid = self.nodes[0].sendtoaddress(mn.fundsAddr, collateral_amount)
1446+
txid = self.nodes[0].sendtoaddress(mn.fundsAddr, mn.get_collateral_value())
14441447
collateral_vout = 0
14451448
register_fund = (idx % 2) == 0
14461449
if not register_fund:
1447-
txraw = self.nodes[0].getrawtransaction(txid, True)
1448-
for vout_idx in range(0, len(txraw["vout"])):
1449-
vout = txraw["vout"][vout_idx]
1450-
if vout["value"] == collateral_amount:
1451-
collateral_vout = vout_idx
1450+
collateral_vout = mn.get_collateral_vout(self.nodes[0], txid)
14521451
self.nodes[0].lockunspent(False, [{'txid': txid, 'vout': collateral_vout}])
14531452

14541453
# send to same address to reserve some funds for fees

0 commit comments

Comments
 (0)