From 6a17a46db6f7a3996c6feecf632092c366e4e0bb Mon Sep 17 00:00:00 2001 From: Kevin Halliday Date: Mon, 29 Jan 2024 17:37:34 -0500 Subject: [PATCH] feat(contracts): verify xsubmission merke proofs Verify XSubmission merkle proofs on xsubmit. --- contracts/package.json | 1 + contracts/pnpm-lock.yaml | 7 + contracts/src/libraries/XBlockMerkleProof.sol | 53 +++++ contracts/test/OmniPortal_exec.t.sol | 22 +- contracts/test/OmniPortal_xsubmit.t.sol | 195 +++++------------- contracts/test/common/Fixtures.sol | 41 ++-- contracts/test/common/TestPortal.sol | 6 +- contracts/test/common/Utils.sol | 44 ++-- contracts/test/data/xsubs.json | 8 +- contracts/test/ts/script/genxsubs/main.ts | 3 +- 10 files changed, 179 insertions(+), 201 deletions(-) create mode 100644 contracts/src/libraries/XBlockMerkleProof.sol diff --git a/contracts/package.json b/contracts/package.json index f09660487..433a208dc 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -7,6 +7,7 @@ "test:gen:xsubs": "ts-node test/ts/script/genxsubs/main.ts" }, "devDependencies": { + "@openzeppelin/contracts": "^5.0.1", "@openzeppelin/merkle-tree": "^1.0.5", "@types/node": "^20.11.7", "ds-test": "https://github.com/dapphub/ds-test", diff --git a/contracts/pnpm-lock.yaml b/contracts/pnpm-lock.yaml index acc2c8450..c9de55bf4 100644 --- a/contracts/pnpm-lock.yaml +++ b/contracts/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false devDependencies: + '@openzeppelin/contracts': + specifier: ^5.0.1 + version: 5.0.1 '@openzeppelin/merkle-tree': specifier: ^1.0.5 version: 1.0.5 @@ -248,6 +251,10 @@ packages: resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} dev: true + /@openzeppelin/contracts@5.0.1: + resolution: {integrity: sha512-yQJaT5HDp9hYOOp4jTYxMsR02gdFZFXhewX5HW9Jo4fsqSVqqyIO/xTHdWDaKX5a3pv1txmf076Lziz+sO7L1w==} + dev: true + /@openzeppelin/merkle-tree@1.0.5: resolution: {integrity: sha512-JkwG2ysdHeIphrScNxYagPy6jZeNONgDRyqU6lbFgE8HKCZFSkcP8r6AjZs+3HZk4uRNV0kNBBzuWhKQ3YV7Kw==} dependencies: diff --git a/contracts/src/libraries/XBlockMerkleProof.sol b/contracts/src/libraries/XBlockMerkleProof.sol new file mode 100644 index 000000000..92b8ab7d4 --- /dev/null +++ b/contracts/src/libraries/XBlockMerkleProof.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity 0.8.23; + +import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; +import { XTypes } from "./XTypes.sol"; + +/** + * @title XBlockMerkleProof + * @dev Library for verifying XBlock merkle proofs + */ +library XBlockMerkleProof { + /** + * @dev Verifies a multi merkle proof for the provided block header and messages, against the provided root. + * Msgs order must match the order used to contstruct the merkle proof. + * @param root The root of the xblock merkle tree, generally XSubmission.attestationRoot. + * @param blockHeader The xblock header. + * @param msgs The xmsgs to verify. + * @param proof The merkle proof. + * @param proofFlags The merkle proof flags. + * @return True if the proof is valid. + */ + function verify( + bytes32 root, + XTypes.BlockHeader calldata blockHeader, + XTypes.Msg[] calldata msgs, + bytes32[] calldata proof, + bool[] calldata proofFlags + ) internal pure returns (bool) { + return MerkleProof.multiProofVerify(proof, proofFlags, root, _leaves(blockHeader, msgs)); + } + + /// @dev Convert block header and msgs to leaf hashes + function _leaves(XTypes.BlockHeader calldata blockHeader, XTypes.Msg[] calldata msgs) + private + pure + returns (bytes32[] memory) + { + bytes32[] memory leaves = new bytes32[](msgs.length + 1); + + leaves[0] = _leafHash(abi.encode((blockHeader))); + for (uint256 i = 0; i < msgs.length; i++) { + leaves[i + 1] = _leafHash(abi.encode((msgs[i]))); + } + + return leaves; + } + + /// @dev Double hash leaves, as recommended by OpenZeppelin, to prevent second preimage attacks + /// Leaves must be double hashed in tree / proof construction + function _leafHash(bytes memory leaf) private pure returns (bytes32) { + return keccak256(bytes.concat(keccak256(leaf))); + } +} diff --git a/contracts/test/OmniPortal_exec.t.sol b/contracts/test/OmniPortal_exec.t.sol index 9315cc2fc..145573d24 100644 --- a/contracts/test/OmniPortal_exec.t.sol +++ b/contracts/test/OmniPortal_exec.t.sol @@ -24,16 +24,7 @@ contract OmniPortal_exec_Test is Base { assertEq(counter.count(), count + 1); assertEq(portal.inXStreamOffset(xmsg.sourceChainId), offset + 1); - - Vm.Log[] memory logs = vm.getRecordedLogs(); - - _assertReceiptEmitted( - logs[0], - xmsg.sourceChainId, - offset, - relayer, - true // success - ); + assertReceipt(vm.getRecordedLogs()[0], xmsg); } /// @dev Test that exec of an XMsg that reverts succeeds, and emits the correct XReceipt @@ -50,16 +41,7 @@ contract OmniPortal_exec_Test is Base { assertEq(counter.count(), count); assertEq(portal.inXStreamOffset(xmsg.sourceChainId), offset + 1); - - Vm.Log[] memory logs = vm.getRecordedLogs(); - - _assertReceiptEmitted( - logs[0], - xmsg.sourceChainId, - offset, - relayer, - false // failure - ); + assertReceipt(vm.getRecordedLogs()[0], xmsg); } /// @dev Test that exec of an XMsg with the wrong destChainId reverts diff --git a/contracts/test/OmniPortal_xsubmit.t.sol b/contracts/test/OmniPortal_xsubmit.t.sol index ccc6c0fbc..c0f4e9c49 100644 --- a/contracts/test/OmniPortal_xsubmit.t.sol +++ b/contracts/test/OmniPortal_xsubmit.t.sol @@ -10,182 +10,83 @@ import { Vm } from "forge-std/Vm.sol"; * @dev Tests of OmniPortal.xsubmit */ contract OmniPortal_xsubmit_Test is Base { - /// @dev Test that an XSubmission with a single XMsg succeeds - /// Check that the correct XReceipt's are emitter, and stream offset is incremented. - function test_xsubmit_xmsgSingle_succeeds() public { - XTypes.Msg[] memory xmsgs = new XTypes.Msg[](1); + function test_xsubmit_xblock1_succeeds() public { + XTypes.Submission memory xsub = readXSubmission("xblock1", portal.chainId()); - xmsgs[0] = _inbound_increment(0); - - XTypes.Submission memory submission = _xsub(xmsgs); - - uint256 count = counter.count(); - uint64 sourceChainId = xmsgs[0].sourceChainId; - uint64 offset = portal.inXStreamOffset(sourceChainId); + uint64 sourceChainId = xsub.msgs[0].sourceChainId; + uint64 expectedOffset = xsub.msgs[0].streamOffset + uint64(xsub.msgs.length); vm.prank(relayer); vm.recordLogs(); - portal.xsubmit(submission); - - assertEq(counter.count(), count + 1); - assertEq(portal.inXStreamOffset(sourceChainId), offset + 1); - - Vm.Log[] memory logs = vm.getRecordedLogs(); + expectCalls(xsub.msgs); + portal.xsubmit(xsub); - assertEq(logs.length, xmsgs.length); - - _assertReceiptEmitted( - logs[0], - sourceChainId, - offset, - relayer, - true // success - ); + assertEq(portal.inXStreamOffset(sourceChainId), expectedOffset); + assertReceipts(vm.getRecordedLogs(), xsub.msgs); } - /// @dev Test that an XSubmission with a batch of XMsgs succeeds. - /// Check that the correct XReceipt's are emitter, and stream offset is incremented. - function test_xsubmit_xmsgBatch_succeeds() public { - XTypes.Msg[] memory xmsgs = new XTypes.Msg[](4); - - xmsgs[0] = _inbound_increment(0); - xmsgs[1] = _inbound_increment(1); - xmsgs[2] = _inbound_increment(2); - xmsgs[3] = _inbound_increment(3); + function test_xsubmit_xblock2_succeeds() public { + XTypes.Submission memory xsub = readXSubmission("xblock2", portal.chainId()); - XTypes.Submission memory submission = _xsub(xmsgs); + uint64 sourceChainId = xsub.msgs[0].sourceChainId; + uint64 expectedOffset = xsub.msgs[0].streamOffset + uint64(xsub.msgs.length); - uint256 count = counter.count(); - uint64 sourceChainId = xmsgs[0].sourceChainId; - uint64 offset = portal.inXStreamOffset(sourceChainId); + // xblock2 starts are later offset + portal.setInXStreamOffset(sourceChainId, xsub.msgs[0].streamOffset); vm.prank(relayer); vm.recordLogs(); - portal.xsubmit(submission); - - assertEq(counter.count(), count + 4); - assertEq(portal.inXStreamOffset(sourceChainId), offset + 4); + expectCalls(xsub.msgs); + portal.xsubmit(xsub); - Vm.Log[] memory logs = vm.getRecordedLogs(); - - assertEq(logs.length, xmsgs.length); - - for (uint256 i = 0; i < xmsgs.length; i++) { - _assertReceiptEmitted( - logs[i], - sourceChainId, - offset + uint64(i), - relayer, - true // success - ); - } + assertEq(portal.inXStreamOffset(sourceChainId), expectedOffset); + assertReceipts(vm.getRecordedLogs(), xsub.msgs); } - /// @dev Test that an XSubmission with a batch of XMsgs, in which one reverts, succeeds. - /// Check that the correct XReceipt's are emitter, and stream offset is incremented. - function test_xsubmit_xmsgBatchWithRevert_succeeds() public { - XTypes.Msg[] memory xmsgs = new XTypes.Msg[](4); - - xmsgs[0] = _inbound_increment(0); - xmsgs[1] = _inbound_increment(1); - xmsgs[2] = _inbound_revert(2); - xmsgs[3] = _inbound_increment(3); + function test_xsubmit_xblock1_chainB_succeeds() public { + XTypes.Submission memory xsub = readXSubmission("xblock1", chainBId); - XTypes.Submission memory submission = _xsub(xmsgs); - - uint256 count = counter.count(); - uint64 sourceChainId = xmsgs[0].sourceChainId; - uint64 offset = portal.inXStreamOffset(sourceChainId); + uint64 sourceChainId = xsub.msgs[0].sourceChainId; + uint64 expectedOffset = xsub.msgs[0].streamOffset + uint64(xsub.msgs.length); vm.prank(relayer); vm.recordLogs(); - portal.xsubmit(submission); - - assertEq(counter.count(), count + 3); // only 3, because one msg was a revert - assertEq(portal.inXStreamOffset(sourceChainId), offset + 4); - - Vm.Log[] memory logs = vm.getRecordedLogs(); - - assertEq(logs.length, xmsgs.length); - - _assertReceiptEmitted( - logs[0], - sourceChainId, - offset, - relayer, - true // success - ); - - _assertReceiptEmitted( - logs[1], - sourceChainId, - offset + 1, - relayer, - true // success - ); - - // this one fails - _assertReceiptEmitted( - logs[2], - sourceChainId, - offset + 2, - relayer, - false // failure - ); - - _assertReceiptEmitted( - logs[3], - sourceChainId, - offset + 3, - relayer, - true // success - ); - } - - /// @dev Test that an XSubmission with a batch of XMsgs with an XMsg behind the current offset reverts - function test_xsubmit_xmsgBatchOneBehindOffset_reverts() public { - XTypes.Msg[] memory xmsgs = new XTypes.Msg[](4); + expectCalls(xsub.msgs); + chainBPortal.xsubmit(xsub); - xmsgs[0] = _inbound_increment(0); - xmsgs[1] = _inbound_increment(1); - xmsgs[2] = _inbound_increment(2); - xmsgs[3] = _inbound_increment(2); // intentionally behind offset - - XTypes.Submission memory submission = _xsub(xmsgs); - - vm.expectRevert("OmniPortal: wrong streamOffset"); - portal.xsubmit(submission); + assertEq(chainBPortal.inXStreamOffset(sourceChainId), expectedOffset); + assertReceipts(vm.getRecordedLogs(), xsub.msgs); } - /// @dev Test that an XSubmission with a batch of XMsgs with an XMsg ahead the current offset reverts - function test_xsubmit_xmsgBatchOneAheadOffset_reverts() public { - XTypes.Msg[] memory xmsgs = new XTypes.Msg[](4); + function test_xsubmit_xblock2_chainB_succeeds() public { + XTypes.Submission memory xsub = readXSubmission("xblock2", chainBId); - xmsgs[0] = _inbound_increment(0); - xmsgs[1] = _inbound_increment(1); - xmsgs[2] = _inbound_increment(2); - xmsgs[3] = _inbound_increment(4); // intentionally ahead offset + uint64 sourceChainId = xsub.msgs[0].sourceChainId; + uint64 expectedOffset = xsub.msgs[0].streamOffset + uint64(xsub.msgs.length); - XTypes.Submission memory submission = _xsub(xmsgs); + // xblock2 starts are later offset + chainBPortal.setInXStreamOffset(sourceChainId, xsub.msgs[0].streamOffset); - vm.expectRevert("OmniPortal: wrong streamOffset"); - portal.xsubmit(submission); - } + vm.prank(relayer); + vm.recordLogs(); + expectCalls(xsub.msgs); + chainBPortal.xsubmit(xsub); - /// @dev Test that an XSubmission with a batch of XMsgs in which one has the wrong destChainId reverts - function test_xsubmit_xmsgBatchWrongChainId_reverts() public { - XTypes.Msg[] memory xmsgs = new XTypes.Msg[](4); + assertEq(chainBPortal.inXStreamOffset(sourceChainId), expectedOffset); + assertReceipts(vm.getRecordedLogs(), xsub.msgs); + } - xmsgs[0] = _inbound_increment(0); - xmsgs[1] = _inbound_increment(1); - xmsgs[2] = _inbound_increment(2); - xmsgs[3] = _inbound_increment(3); + function test_xsubmit_wrongChainId_reverts() public { + XTypes.Submission memory xsub = readXSubmission("xblock1", portal.chainId()); - xmsgs[1].destChainId = xmsgs[0].destChainId + 1; // intentionally wrong chainId + vm.expectRevert("OmniPortal: wrong destChainId"); + chainBPortal.xsubmit(xsub); + } - XTypes.Submission memory submission = _xsub(xmsgs); + function test_xsubmit_wrongStreamOffset_reverts() public { + XTypes.Submission memory xsub = readXSubmission("xblock2", portal.chainId()); - vm.expectRevert("OmniPortal: wrong destChainId"); - portal.xsubmit(submission); + vm.expectRevert("OmniPortal: wrong streamOffset"); + portal.xsubmit(xsub); } } diff --git a/contracts/test/common/Fixtures.sol b/contracts/test/common/Fixtures.sol index 3b7c6e6d2..e0a022c2d 100644 --- a/contracts/test/common/Fixtures.sol +++ b/contracts/test/common/Fixtures.sol @@ -2,6 +2,7 @@ pragma solidity 0.8.23; import { CommonBase } from "forge-std/Base.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { StdCheats } from "forge-std/StdCheats.sol"; import { XTypes } from "src/libraries/XTypes.sol"; import { TestXTypes } from "./TestXTypes.sol"; @@ -45,13 +46,20 @@ contract Fixtures is CommonBase, StdCheats { Reverter chainBReverter; // helper mappings to generate XMsg.to and XMsg.sender for some sourceChainId & destChainId - mapping(uint64 => address) private _reverters; - mapping(uint64 => address) private _counters; + mapping(uint64 => address) _reverters; + mapping(uint64 => address) _counters; // @dev Path to which test XBlocks are written relative to project root. Read by ts utilites // to generate XSubmissions for each test XBlock (see ts/script/genxsubs/io.ts) string constant XBLOCKS_PATH = "test/data/xblocks.json"; + // @dev Path to which test XSubmissions are written relative to project root. XSubmissions + // are generated for each test XBlock, per destination chain, by ts/script/genxsubs/main.ts. + string constant XSUBS_PATH = "test/data/xsubs.json"; + + /// @dev XSubs json read from XSUBS_PATH, stored to avoid re-reading fro disk + string private _xsubsJson; + function setUp() public { deployer = makeAddr("deployer"); xcaller = makeAddr("xcaller"); @@ -104,6 +112,23 @@ contract Fixtures is CommonBase, StdCheats { vm.writeJson(json, fullpath); } + /// @dev Read a test fixture XSubmission from XSUBS_PATH, for a given xblockName and destChainId. + /// XSubmissions are generated by ts/script/genxsubs/main.ts, and written to XSUBS_PATH. + function readXSubmission(string memory xblockName, uint64 destChainId) public returns (XTypes.Submission memory) { + string memory root = vm.projectRoot(); + string memory path = string.concat(root, "/", XSUBS_PATH); + + if (bytes(_xsubsJson).length == 0) _xsubsJson = vm.readFile(path); + + // matches xsub name in ts/script/genxsubs/main.ts + string memory xsubName = string.concat(xblockName, "_xsub_destChainId", Strings.toString(destChainId)); + bytes memory parsed = vm.parseJsonBytes(_xsubsJson, string.concat(".", xsubName)); + + XTypes.Submission memory xsub = abi.decode(parsed, (XTypes.Submission)); + + return xsub; + } + /// @dev Create an xblock from chainA with xmsgs for "this" chain and chain b. /// XBlocks will likely contain XMsgs for multiple chains, so we reflect that here. function _xblock(uint64 sourceBlockHeight, uint64 startOffset) internal view returns (TestXTypes.Block memory) { @@ -126,18 +151,6 @@ contract Fixtures is CommonBase, StdCheats { return TestXTypes.Block(XTypes.BlockHeader(chainAId, sourceBlockHeight, keccak256("blockhash")), xmsgs); } - /// @dev Create an test XSubmission - function _xsub(XTypes.Msg[] memory xmsgs) internal pure returns (XTypes.Submission memory) { - return XTypes.Submission({ - attestationRoot: bytes32(0), // TODO: still unchecked - blockHeader: XTypes.BlockHeader(0, 0, 0), // TODO: still unchecked - msgs: xmsgs, - proof: new bytes32[](0), // TODO: still unchecked - proofFlags: new bool[](0), // TODO: still unchecked - signatures: new XTypes.SigTuple[](0) // TODO: still unchecked - }); - } - /// @dev Create a Counter.increment() XMsg from thisChainId to chainAId function _outbound_increment() internal view returns (XTypes.Msg memory) { return _increment(thisChainId, chainAId, 0); diff --git a/contracts/test/common/TestPortal.sol b/contracts/test/common/TestPortal.sol index 588a0eb10..e1f210cb4 100644 --- a/contracts/test/common/TestPortal.sol +++ b/contracts/test/common/TestPortal.sol @@ -6,10 +6,14 @@ import { XTypes } from "src/libraries/XTypes.sol"; /** * @title TestPortal - * @dev A test contract that exposes the OmniPortal's internal functions. + * @dev A test contract that exposes OmniPortal internal functions, and allows state manipulation. */ contract TestPortal is OmniPortal { function exec(XTypes.Msg calldata xmsg) external { _exec(xmsg); } + + function setInXStreamOffset(uint64 destChainId, uint64 offset) external { + inXStreamOffset[destChainId] = offset; + } } diff --git a/contracts/test/common/Utils.sol b/contracts/test/common/Utils.sol index 5b05665be..840c0852e 100644 --- a/contracts/test/common/Utils.sol +++ b/contracts/test/common/Utils.sol @@ -3,16 +3,18 @@ pragma solidity 0.8.23; import { Test } from "forge-std/Test.sol"; import { Vm } from "forge-std/Vm.sol"; +import { XTypes } from "src/libraries/XTypes.sol"; import { Events } from "./Events.sol"; import { TestXTypes } from "./TestXTypes.sol"; +import { Fixtures } from "./Fixtures.sol"; /** * @title Utils * @dev Defines test utilities. */ -contract Utils is Test, Events { +contract Utils is Test, Events, Fixtures { /// @dev Parse an XReceipt log - function _parseReceipt(Vm.Log memory log) internal returns (TestXTypes.Receipt memory) { + function parseReceipt(Vm.Log memory log) internal returns (TestXTypes.Receipt memory) { assertEq(log.topics.length, 3); assertEq(log.topics[0], XReceipt.selector); @@ -27,20 +29,34 @@ contract Utils is Test, Events { }); } + /// _dev + function assertReceipts(Vm.Log[] memory logs, XTypes.Msg[] memory xmsgs) internal { + assertEq(logs.length, xmsgs.length); + for (uint256 i = 0; i < logs.length; i++) { + assertReceipt(logs[i], xmsgs[i]); + } + } + /// @dev Assert that the log is an XReceipt event with the correct fields. /// We use this helper rather than vm.expectEmit(), because gasUsed is difficult to predict. - function _assertReceiptEmitted( - Vm.Log memory log, - uint64 sourceChainId, - uint64 streamOffset, - address relayer, - bool success - ) internal { - TestXTypes.Receipt memory receipt = _parseReceipt(log); - - assertEq(receipt.sourceChainId, sourceChainId); - assertEq(receipt.streamOffset, streamOffset); + function assertReceipt(Vm.Log memory log, XTypes.Msg memory xmsg) internal { + TestXTypes.Receipt memory receipt = parseReceipt(log); + + assertEq(receipt.sourceChainId, xmsg.sourceChainId); + assertEq(receipt.streamOffset, xmsg.streamOffset); assertEq(receipt.relayer, relayer); - assertEq(receipt.success, success); + assertEq( + receipt.success, + // little hacky, but deriving receipts from messages helps + // readability and this let's us do that + xmsg.to == _reverters[xmsg.destChainId] ? false : true + ); + } + + /// @dev vm.expectCall() for multiple XMsgs + function expectCalls(XTypes.Msg[] memory xmsgs) internal { + for (uint256 i = 0; i < xmsgs.length; i++) { + vm.expectCall(xmsgs[i].to, xmsgs[i].data); + } } } diff --git a/contracts/test/data/xsubs.json b/contracts/test/data/xsubs.json index e6e3f6683..dad88d058 100644 --- a/contracts/test/data/xsubs.json +++ b/contracts/test/data/xsubs.json @@ -1,6 +1,6 @@ { - "xblock1_xsub_destChainId=1": "0x00000000000000000000000000000000000000000000000000000000000000208b89911ac5aec02e4b032d2519bfc45e44ed786938a03d27cb31363d16ec2bd000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d60ee5d9b1a312631632d0ab8816ca64259093d8ab0b4d29f35db6a6151b0f8d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000a5906e11c3b7f5b832bcbf389295d44e7695b4a6000000000000000000000000ff2bd636b9fc89645c2d336aeade2e4abafe1ea500000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000411cf11ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f0120f6cca41be65f359c800862e31aa511d149db3bb0c183b2d4768012a614e5a040ba88dfb4f6e165c65c81e12fcd8544f5c0201dcc55e80e3abfd361c9a46000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "xblock1_xsub_destChainId=3": "0x00000000000000000000000000000000000000000000000000000000000000208b89911ac5aec02e4b032d2519bfc45e44ed786938a03d27cb31363d16ec2bd000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d60ee5d9b1a312631632d0ab8816ca64259093d8ab0b4d29f35db6a6151b0f8d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000a5906e11c3b7f5b832bcbf389295d44e7695b4a6000000000000000000000000eed3f8736c808cc675486631d77a56b9cf8f609400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000411cf11ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000040000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025b9ea660a873a9b2a74344b32ad7d96c34fa9588693b7cce80b48bd4edf9af1b17d64dd8dc6a5dda1b037ac6e972d30b1a0b2851cc5c75cddd64b4854b3aaedc000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000", - "xblock2_xsub_destChainId=1": "0x0000000000000000000000000000000000000000000000000000000000000020c8af07991ec8dea635907fb1d0c3efc357c97356a0494bffd1e63cfcfbd9d1a800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d60ee5d9b1a312631632d0ab8816ca64259093d8ab0b4d29f35db6a6151b0f8d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000a5906e11c3b7f5b832bcbf389295d44e7695b4a6000000000000000000000000ff2bd636b9fc89645c2d336aeade2e4abafe1ea500000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000411cf11ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021ed933b67942e476edb565b7f0d4a53acba6eed2565594477f3d0f59f1b69473512fb8b704ee0028d65e05405b1c16614a725af41aa84295dbd2ce97b753b2a6000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "xblock2_xsub_destChainId=3": "0x0000000000000000000000000000000000000000000000000000000000000020c8af07991ec8dea635907fb1d0c3efc357c97356a0494bffd1e63cfcfbd9d1a800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d60ee5d9b1a312631632d0ab8816ca64259093d8ab0b4d29f35db6a6151b0f8d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000a5906e11c3b7f5b832bcbf389295d44e7695b4a6000000000000000000000000eed3f8736c808cc675486631d77a56b9cf8f609400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000411cf11ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0ce6ef56d9a9f035ac0e8eeb51b9b430407f85ad18beb233d464e71b91c54134f4ca1c7f9547e25110351ad9a2c95f282fa5b55bca6ce094c9d3b1d7093e6b1000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" + "xblock1_xsub_destChainId1": "0x00000000000000000000000000000000000000000000000000000000000000208b89911ac5aec02e4b032d2519bfc45e44ed786938a03d27cb31363d16ec2bd000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d60ee5d9b1a312631632d0ab8816ca64259093d8ab0b4d29f35db6a6151b0f8d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000a5906e11c3b7f5b832bcbf389295d44e7695b4a6000000000000000000000000ff2bd636b9fc89645c2d336aeade2e4abafe1ea500000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000411cf11ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f0120f6cca41be65f359c800862e31aa511d149db3bb0c183b2d4768012a614e5a040ba88dfb4f6e165c65c81e12fcd8544f5c0201dcc55e80e3abfd361c9a46000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "xblock1_xsub_destChainId3": "0x00000000000000000000000000000000000000000000000000000000000000208b89911ac5aec02e4b032d2519bfc45e44ed786938a03d27cb31363d16ec2bd000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d60ee5d9b1a312631632d0ab8816ca64259093d8ab0b4d29f35db6a6151b0f8d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000a5906e11c3b7f5b832bcbf389295d44e7695b4a6000000000000000000000000eed3f8736c808cc675486631d77a56b9cf8f609400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000411cf11ae000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000040000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025b9ea660a873a9b2a74344b32ad7d96c34fa9588693b7cce80b48bd4edf9af1b17d64dd8dc6a5dda1b037ac6e972d30b1a0b2851cc5c75cddd64b4854b3aaedc000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000", + "xblock2_xsub_destChainId1": "0x0000000000000000000000000000000000000000000000000000000000000020c8af07991ec8dea635907fb1d0c3efc357c97356a0494bffd1e63cfcfbd9d1a800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d60ee5d9b1a312631632d0ab8816ca64259093d8ab0b4d29f35db6a6151b0f8d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000a5906e11c3b7f5b832bcbf389295d44e7695b4a6000000000000000000000000ff2bd636b9fc89645c2d336aeade2e4abafe1ea500000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000411cf11ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc0000000000000000000000001240fa2a84dd9157a0e76b5cfe98b1d52268b26400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021ed933b67942e476edb565b7f0d4a53acba6eed2565594477f3d0f59f1b69473512fb8b704ee0028d65e05405b1c16614a725af41aa84295dbd2ce97b753b2a6000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "xblock2_xsub_destChainId3": "0x0000000000000000000000000000000000000000000000000000000000000020c8af07991ec8dea635907fb1d0c3efc357c97356a0494bffd1e63cfcfbd9d1a800000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d60ee5d9b1a312631632d0ab8816ca64259093d8ab0b4d29f35db6a6151b0f8d0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000a5906e11c3b7f5b832bcbf389295d44e7695b4a6000000000000000000000000eed3f8736c808cc675486631d77a56b9cf8f609400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d40000000000000000000000000000000000000000000000000000000000000000411cf11ae0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000009101223d33eeaea94045bb2920f00ba0f7a475bc00000000000000000000000013250cf16eec77781dcf240b067cac78f2b2adf800000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000004d09de08a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002a0ce6ef56d9a9f035ac0e8eeb51b9b430407f85ad18beb233d464e71b91c54134f4ca1c7f9547e25110351ad9a2c95f282fa5b55bca6ce094c9d3b1d7093e6b1000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000" } diff --git a/contracts/test/ts/script/genxsubs/main.ts b/contracts/test/ts/script/genxsubs/main.ts index 9a346bd64..ccbfc46aa 100644 --- a/contracts/test/ts/script/genxsubs/main.ts +++ b/contracts/test/ts/script/genxsubs/main.ts @@ -34,8 +34,9 @@ function getXSubs(b: NamedXBlock) { return xsubs } +// matches xsub name referenced in common/Fixture.sol:readXSubmission const xsubName = (xblockName: string, destChainId: string) => - [xblockName, 'xsub', 'destChainId=' + destChainId].join('_') + [xblockName, 'xsub', 'destChainId' + destChainId].join('_') function main() { const xblocks = readXBlocks()