diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index bd85977a6d..b4b225ad38 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -3684,6 +3684,9 @@ static RPCHelpMan getsidechaininfo() {{RPCResult::Type::STR_HEX, "", "active fedpegscript"}}}, {RPCResult::Type::STR_HEX, "pegged_asset", "Pegged asset type"}, {RPCResult::Type::STR_HEX, "fee_asset", "The asset used for transaction fees and relay policy"}, + {RPCResult::Type::STR_AMOUNT, "genesis_subsidy", "The block subsidy at genesis, before any halving"}, + {RPCResult::Type::STR_HEX, "subsidy_asset", "The asset in which the block subsidy is paid"}, + {RPCResult::Type::NUM, "subsidy_halving_interval", "The number of blocks between block subsidy halvings"}, {RPCResult::Type::STR, "min_peg_diff", "The minimum difficulty parent chain header target. Peg-in headers that have less work will be rejected as an anti-Dos measure"}, {RPCResult::Type::STR_HEX, "parent_blockhash", "The parent genesis blockhash as source of pegged-in funds"}, {RPCResult::Type::BOOL, "parent_chain_has_pow", "Whether parent chain has pow or signed blocks"}, @@ -3726,6 +3729,9 @@ static RPCHelpMan getsidechaininfo() obj.pushKV("current_fedpegscripts", fedpeg_entries); obj.pushKV("pegged_asset", consensus.pegged_asset.GetHex()); obj.pushKV("fee_asset", policyAsset.GetHex()); + obj.pushKV("genesis_subsidy", ValueFromAmount(consensus.genesis_subsidy)); + obj.pushKV("subsidy_asset", consensus.subsidy_asset.GetHex()); + obj.pushKV("subsidy_halving_interval", consensus.nSubsidyHalvingInterval); obj.pushKV("min_peg_diff", consensus.parentChainPowLimit.GetHex()); obj.pushKV("parent_blockhash", parent_blockhash.GetHex()); obj.pushKV("parent_chain_has_pow", consensus.ParentChainHasPow()); diff --git a/test/functional/rpc_sidechaininfo.py b/test/functional/rpc_sidechaininfo.py index 596385bc58..0708fdd806 100755 --- a/test/functional/rpc_sidechaininfo.py +++ b/test/functional/rpc_sidechaininfo.py @@ -4,34 +4,66 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test the getsidechaininfo fee-asset contract.""" +from copy import deepcopy +from decimal import Decimal + from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import BITCOIN_ASSET, assert_equal, assert_is_hash_string +from test_framework.util import BITCOIN_ASSET, assert_equal +DEFAULT_INFO = { + "fedpegscript": "51", + "current_fedpeg_programs": ["a91472c44f957fc011d97e3406667dca5b1c930c402687"], + "current_fedpegscripts": ["51"], + "pegged_asset": BITCOIN_ASSET, + "fee_asset": BITCOIN_ASSET, + "genesis_subsidy": Decimal("50.00000000"), + "subsidy_asset": BITCOIN_ASSET, + "subsidy_halving_interval": 150, + "min_peg_diff": "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "parent_blockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206", + "parent_chain_has_pow": True, + "enforce_pak": False, + "pegin_confirmation_depth": 8, +} OVERRIDE_FEE_ASSET = "11" * 32 +BLOCKSUBSIDY_INFO = { + "genesis_subsidy": 0, + "subsidy_asset": "aa" * 32, + "subsidy_halving_interval": 10, +} class SidechainInfoTest(BitcoinTestFramework): def set_test_params(self): - self.num_nodes = 2 + self.num_nodes = 3 self.setup_clean_chain = True - self.extra_args = [[], [f"-feeasset={OVERRIDE_FEE_ASSET}"]] + self.extra_args = [ + # node 0: default + [], + # node 1: override feeasset + [f"-feeasset={OVERRIDE_FEE_ASSET}"], + # node 2: override blocksubsidy params + [ + f"-con_blocksubsidy={BLOCKSUBSIDY_INFO['genesis_subsidy']}", + f"-con_nsubsidyhalvinginterval={BLOCKSUBSIDY_INFO['subsidy_halving_interval']}", + f"-subsidyasset={BLOCKSUBSIDY_INFO['subsidy_asset']}", + ] + ] def setup_network(self): self.setup_nodes() def run_test(self): - default_info = self.nodes[0].getsidechaininfo() - override_info = self.nodes[1].getsidechaininfo() + assert_equal(self.nodes[0].getsidechaininfo(), DEFAULT_INFO) - for info in [default_info, override_info]: - assert_is_hash_string(info["pegged_asset"]) - assert_is_hash_string(info["fee_asset"]) - assert_equal(info["pegged_asset"], BITCOIN_ASSET) + info = deepcopy(DEFAULT_INFO) + info.update({"fee_asset": OVERRIDE_FEE_ASSET}) + assert_equal(self.nodes[1].getsidechaininfo(), info) - assert_equal(default_info["fee_asset"], default_info["pegged_asset"]) - assert_equal(override_info["fee_asset"], OVERRIDE_FEE_ASSET) - assert_equal(override_info["pegged_asset"], default_info["pegged_asset"]) + info = deepcopy(DEFAULT_INFO) + info.update(BLOCKSUBSIDY_INFO) + assert_equal(self.nodes[2].getsidechaininfo(), info) if __name__ == "__main__":