2020-12-15 03:15:09 +01:00
|
|
|
#!/usr/bin/env python3
|
2023-12-31 01:00:00 +01:00
|
|
|
# Copyright (c) 2020-2023 The Dash Core developers
|
2020-12-15 03:15:09 +01:00
|
|
|
# Distributed under the MIT software license, see the accompanying
|
|
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
from test_framework.test_framework import DashTestFramework
|
|
|
|
from test_framework.util import assert_equal
|
|
|
|
|
|
|
|
'''
|
|
|
|
rpc_masternode.py
|
|
|
|
|
|
|
|
Test "masternode" rpc subcommands
|
|
|
|
'''
|
|
|
|
|
|
|
|
class RPCMasternodeTest(DashTestFramework):
|
|
|
|
def set_test_params(self):
|
|
|
|
self.set_dash_test_params(4, 3, fast_dip3_enforcement=True)
|
|
|
|
|
|
|
|
def run_test(self):
|
|
|
|
self.log.info("test that results from `winners` and `payments` RPCs match")
|
2020-12-24 00:24:06 +01:00
|
|
|
blockhash = ""
|
|
|
|
payments = []
|
|
|
|
# we expect some masternodes to have 0 operator reward and some to have non-0 operator reward
|
|
|
|
checked_0_operator_reward = False
|
|
|
|
checked_non_0_operator_reward = False
|
|
|
|
while not checked_0_operator_reward or not checked_non_0_operator_reward:
|
|
|
|
self.nodes[0].generate(1)
|
|
|
|
bi = self.nodes[0].getblockchaininfo()
|
|
|
|
height = bi["blocks"]
|
|
|
|
blockhash = bi["bestblockhash"]
|
|
|
|
winners_payee = self.nodes[0].masternode("winners")[str(height)]
|
|
|
|
payments = self.nodes[0].masternode("payments", blockhash)
|
|
|
|
assert_equal(len(payments), 1)
|
|
|
|
payments_block = payments[0]
|
|
|
|
payments_block_payees = payments_block["masternodes"][0]["payees"]
|
|
|
|
payments_payee = ""
|
|
|
|
for i in range(0, len(payments_block_payees)):
|
|
|
|
payments_payee += payments_block_payees[i]["address"]
|
|
|
|
if i < len(payments_block_payees) - 1:
|
|
|
|
payments_payee += ", "
|
|
|
|
assert_equal(payments_block["height"], height)
|
|
|
|
assert_equal(payments_block["blockhash"], blockhash)
|
|
|
|
assert_equal(winners_payee, payments_payee)
|
|
|
|
if len(payments_block_payees) == 1:
|
|
|
|
checked_0_operator_reward = True
|
|
|
|
if len(payments_block_payees) > 1:
|
|
|
|
checked_non_0_operator_reward = True
|
2020-12-15 03:15:09 +01:00
|
|
|
|
|
|
|
self.log.info("test various `payments` RPC options")
|
|
|
|
payments1 = self.nodes[0].masternode("payments", blockhash, -1)
|
|
|
|
assert_equal(payments, payments1)
|
|
|
|
payments2_1 = self.nodes[0].masternode("payments", blockhash, 2)
|
|
|
|
# using chaintip as a start block should return 1 block only
|
|
|
|
assert_equal(len(payments2_1), 1)
|
|
|
|
assert_equal(payments[0], payments2_1[0])
|
|
|
|
payments2_2 = self.nodes[0].masternode("payments", blockhash, -2)
|
|
|
|
# using chaintip as a start block should return 2 blocks now, with the tip being the last one
|
|
|
|
assert_equal(len(payments2_2), 2)
|
|
|
|
assert_equal(payments[0], payments2_2[-1])
|
|
|
|
|
|
|
|
self.log.info("test that `masternode payments` results at chaintip match `getblocktemplate` results for that block")
|
|
|
|
gbt_masternode = self.nodes[0].getblocktemplate()["masternode"]
|
|
|
|
self.nodes[0].generate(1)
|
|
|
|
payments_masternode = self.nodes[0].masternode("payments")[0]["masternodes"][0]
|
2020-12-24 00:24:06 +01:00
|
|
|
for i in range(0, len(gbt_masternode)):
|
|
|
|
assert_equal(gbt_masternode[i]["payee"], payments_masternode["payees"][i]["address"])
|
|
|
|
assert_equal(gbt_masternode[i]["script"], payments_masternode["payees"][i]["script"])
|
|
|
|
assert_equal(gbt_masternode[i]["amount"], payments_masternode["payees"][i]["amount"])
|
2020-12-15 03:15:09 +01:00
|
|
|
|
2023-02-10 12:21:05 +01:00
|
|
|
self.log.info("test that `masternode payments` results and `protx info` results match")
|
|
|
|
# we expect some masternodes to have 0 operator reward and some to have non-0 operator reward
|
|
|
|
checked_0_operator_reward = False
|
|
|
|
checked_non_0_operator_reward = False
|
|
|
|
while not checked_0_operator_reward or not checked_non_0_operator_reward:
|
|
|
|
payments_masternode = self.nodes[0].masternode("payments")[0]["masternodes"][0]
|
|
|
|
protx_info = self.nodes[0].protx("info", payments_masternode["proTxHash"])
|
|
|
|
if len(payments_masternode["payees"]) == 1:
|
|
|
|
assert_equal(protx_info["state"]["payoutAddress"], payments_masternode["payees"][0]["address"])
|
|
|
|
checked_0_operator_reward = True
|
|
|
|
else:
|
|
|
|
assert_equal(len(payments_masternode["payees"]), 2)
|
|
|
|
option1 = protx_info["state"]["payoutAddress"] == payments_masternode["payees"][0]["address"] and \
|
|
|
|
protx_info["state"]["operatorPayoutAddress"] == payments_masternode["payees"][1]["address"]
|
|
|
|
option2 = protx_info["state"]["payoutAddress"] == payments_masternode["payees"][1]["address"] and \
|
|
|
|
protx_info["state"]["operatorPayoutAddress"] == payments_masternode["payees"][0]["address"]
|
|
|
|
assert option1 or option2
|
|
|
|
checked_non_0_operator_reward = True
|
|
|
|
self.nodes[0].generate(1)
|
|
|
|
|
2022-08-31 12:32:35 +02:00
|
|
|
self.log.info("test that `masternode outputs` show correct list")
|
|
|
|
addr1 = self.nodes[0].getnewaddress()
|
|
|
|
addr2 = self.nodes[0].getnewaddress()
|
|
|
|
self.nodes[0].sendmany('', {addr1: 1000, addr2: 1000})
|
|
|
|
self.nodes[0].generate(1)
|
|
|
|
# we have 3 masternodes that are running already and 2 new outputs we just created
|
|
|
|
assert_equal(len(self.nodes[0].masternode("outputs")), 5)
|
2020-12-15 03:15:09 +01:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
RPCMasternodeTest().main()
|