From 81ab30f69bec6823f73e23f048595e47fdf7a11f Mon Sep 17 00:00:00 2001 From: Leonardo Comandini Date: Tue, 20 Oct 2026 12:01:13 +0200 Subject: [PATCH 1/3] test: rpc: getsidechaininfo: assert against all returned values --- test/functional/rpc_sidechaininfo.py | 29 ++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/test/functional/rpc_sidechaininfo.py b/test/functional/rpc_sidechaininfo.py index 596385bc58..4e73e7e746 100755 --- a/test/functional/rpc_sidechaininfo.py +++ b/test/functional/rpc_sidechaininfo.py @@ -5,9 +5,21 @@ """Test the getsidechaininfo fee-asset contract.""" 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, + "min_peg_diff": "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "parent_blockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206", + "parent_chain_has_pow": True, + "enforce_pak": False, + "pegin_confirmation_depth": 8, +} OVERRIDE_FEE_ASSET = "11" * 32 @@ -24,14 +36,11 @@ def run_test(self): default_info = self.nodes[0].getsidechaininfo() override_info = self.nodes[1].getsidechaininfo() - 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) + assert_equal(default_info, DEFAULT_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"]) + updated_info = default_info + updated_info.update({"fee_asset": OVERRIDE_FEE_ASSET}) + assert_equal(override_info, updated_info) if __name__ == "__main__": From 8c5b285f42dbdacdef9be392770eaa3e2e2718c6 Mon Sep 17 00:00:00 2001 From: Leonardo Comandini Date: Tue, 20 Oct 2026 12:23:55 +0200 Subject: [PATCH 2/3] rpc: sidechaininfo: return blocksubsidy related fields --- src/rpc/blockchain.cpp | 6 ++++++ test/functional/rpc_sidechaininfo.py | 5 +++++ 2 files changed, 11 insertions(+) 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 4e73e7e746..7487430ed0 100755 --- a/test/functional/rpc_sidechaininfo.py +++ b/test/functional/rpc_sidechaininfo.py @@ -4,6 +4,8 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test the getsidechaininfo fee-asset contract.""" +from decimal import Decimal + from test_framework.test_framework import BitcoinTestFramework from test_framework.util import BITCOIN_ASSET, assert_equal @@ -14,6 +16,9 @@ "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, From 53fa0134fbc5a9cdacbe6fe4d73d16c4397c5ec8 Mon Sep 17 00:00:00 2001 From: Leonardo Comandini Date: Tue, 20 Oct 2026 14:22:30 +0200 Subject: [PATCH 3/3] test: rpc: getsidechaininfo: assert against blocksubsidy info --- test/functional/rpc_sidechaininfo.py | 34 +++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/test/functional/rpc_sidechaininfo.py b/test/functional/rpc_sidechaininfo.py index 7487430ed0..0708fdd806 100755 --- a/test/functional/rpc_sidechaininfo.py +++ b/test/functional/rpc_sidechaininfo.py @@ -4,6 +4,7 @@ # 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 @@ -26,26 +27,43 @@ "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) - assert_equal(default_info, DEFAULT_INFO) + info = deepcopy(DEFAULT_INFO) + info.update({"fee_asset": OVERRIDE_FEE_ASSET}) + assert_equal(self.nodes[1].getsidechaininfo(), info) - updated_info = default_info - updated_info.update({"fee_asset": OVERRIDE_FEE_ASSET}) - assert_equal(override_info, updated_info) + info = deepcopy(DEFAULT_INFO) + info.update(BLOCKSUBSIDY_INFO) + assert_equal(self.nodes[2].getsidechaininfo(), info) if __name__ == "__main__":