diff --git a/overridden_contracts/.env.example b/overridden_contracts/.env.example deleted file mode 100644 index a60564a..0000000 --- a/overridden_contracts/.env.example +++ /dev/null @@ -1,30 +0,0 @@ -export RPC_URL= -export ETHERSCAN_API_KEY= -export PRIVATE_KEY= -export BEEFY_CLIENT_CONTRACT_ADDRESS= - -export RANDAO_COMMIT_DELAY=3 -export RANDAO_COMMIT_EXP=8 -export MINIMUM_REQUIRED_SIGNATURES=16 -export PREV_RANDAO=377 -export ValidatorSetSize=300 -export PARAID=1000 -export RELAYER_FEE=100 -export RELAYER_REWARD=100 -export STATEMINT_LOCATION=0x09b636bf387d256bd35ebf301c2da34fdee53b42f6a4648ad126156034d4a2db -export CREATE_TOKEN_FEE="1000000000000000000" - -export BRIDGE_HUB_PARAID=1 -export BRIDGE_HUB_AGENT_ID=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 -export ASSET_HUB_PARAID=1 -export ASSET_HUB_AGENT_ID=0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6 - -export FOREIGN_TOKEN_DECIMALS=12 -export RESERVE_TRANSFER_MAX_DESTINATION_FEE=1000000000000000000 -export REJECT_OUTBOUND_MESSAGES=false -export DELIVERY_COST=1000000000000000000 -export REGISTER_TOKEN_FEE=1000000000000000000 -export CREATE_ASSET_FEE=1000000000000000000 -export RESERVE_TRANSFER_FEE=1000000000000000000 -export EXCHANGE_RATE=1000000000000000000 -export FEE_MULTIPLIER=1000000000000000000 diff --git a/overridden_contracts/scripts/DeployBeefyLocal.sol b/overridden_contracts/scripts/DeployBeefyLocal.sol deleted file mode 100644 index 716536e..0000000 --- a/overridden_contracts/scripts/DeployBeefyLocal.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.25; - -import {Script, console2} from "forge-std/Script.sol"; -import {stdJson} from "forge-std/StdJson.sol"; - -import {BeefyClient} from "../src/BeefyClient.sol"; -import {HelperConfig} from "./HelperConfig.sol"; - -contract DeployBeefyClient is Script { - using stdJson for string; - - function setUp() public {} - - function run() public { - HelperConfig helperConfig = new HelperConfig(""); - HelperConfig.BeefyClientConfig memory beefyClientConfig = helperConfig.getBeefyClientConfig(); - - vm.startBroadcast(); - - // BeefyClient - // Seems `fs_permissions` explicitly configured as absolute path does not work and only allowed from project root - string memory root = vm.projectRoot(); - string memory beefyCheckpointFile = string.concat(root, "/beefy-state.json"); - string memory beefyCheckpointRaw = vm.readFile(beefyCheckpointFile); - uint64 startBlock = uint64(beefyCheckpointRaw.readUint(".startBlock")); - - BeefyClient.ValidatorSet memory current = BeefyClient.ValidatorSet( - uint128(beefyCheckpointRaw.readUint(".current.id")), - uint128(beefyCheckpointRaw.readUint(".current.length")), - beefyCheckpointRaw.readBytes32(".current.root") - ); - BeefyClient.ValidatorSet memory next = BeefyClient.ValidatorSet( - uint128(beefyCheckpointRaw.readUint(".next.id")), - uint128(beefyCheckpointRaw.readUint(".next.length")), - beefyCheckpointRaw.readBytes32(".next.root") - ); - - BeefyClient beefyClient = new BeefyClient( - beefyClientConfig.randaoCommitDelay, - beefyClientConfig.randaoCommitExpiration, - beefyClientConfig.minimumSignatures, - startBlock, - current, - next - ); - - console2.log("BeefyClient: ", address(beefyClient)); - - vm.stopBroadcast(); - } -} diff --git a/overridden_contracts/scripts/DeployGatewayUpgrade.sol b/overridden_contracts/scripts/DeployGatewayUpgrade.sol deleted file mode 100644 index 13ca5f9..0000000 --- a/overridden_contracts/scripts/DeployGatewayUpgrade.sol +++ /dev/null @@ -1,53 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.25; - -import {console2} from "forge-std/console2.sol"; -import {Script} from "forge-std/Script.sol"; -import {stdJson} from "forge-std/StdJson.sol"; - -import {GatewayTanssi202506} from "../src/upgrades/GatewayTanssi202506.sol"; -import {HelperConfig} from "./HelperConfig.sol"; -import {UpgradeParams} from "../src/Params.sol"; - -contract DeployLocal is Script { - using stdJson for string; - - function setUp() public {} - - function run() public { - HelperConfig helperConfig = new HelperConfig(""); - _deploy(helperConfig); - } - - function run(string calldata testnet) public { - HelperConfig helperConfig = new HelperConfig(testnet); - _deploy(helperConfig); - } - - function _deploy(HelperConfig helperConfig) private { - vm.startBroadcast(); - HelperConfig.GatewayConfig memory gatewayConfig = helperConfig.getGatewayConfig(); - - GatewayTanssi202506 gatewayLogic = new GatewayTanssi202506( - address(gatewayConfig.beefyClient), - address(gatewayConfig.agentExecutor), - gatewayConfig.bridgeHubParaID, - gatewayConfig.bridgeHubAgentID, - gatewayConfig.foreignTokenDecimals, - gatewayConfig.maxDestinationFee - ); - - console2.log("Gateway logic impl: ", address(gatewayLogic)); - console2.log("Gateway logic codehash: "); - console2.logBytes32(address(gatewayLogic).codehash); - UpgradeParams memory params = UpgradeParams({ - impl: address(gatewayLogic), - implCodeHash: address(gatewayLogic).codehash, - initParams: bytes("") - }); - - console2.logBytes(abi.encode(params)); - vm.stopBroadcast(); - } -} diff --git a/overridden_contracts/scripts/DeployLocal.sol b/overridden_contracts/scripts/DeployLocal.sol deleted file mode 100644 index 3f33d3c..0000000 --- a/overridden_contracts/scripts/DeployLocal.sol +++ /dev/null @@ -1,113 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.25; - -import {Script} from "forge-std/Script.sol"; -import {stdJson} from "forge-std/StdJson.sol"; -import {BeefyClient} from "../src/BeefyClient.sol"; -import {console2} from "forge-std/console2.sol"; -import {GatewayProxy} from "../src/GatewayProxy.sol"; -import {Gateway} from "../src/Gateway.sol"; -import {AgentExecutor} from "../src/AgentExecutor.sol"; -import {OperatingMode} from "../src/Types.sol"; -import {HelperConfig} from "./HelperConfig.sol"; -import {WETH9} from "canonical-weth/WETH9.sol"; -import {IGateway} from "../src/interfaces/IGateway.sol"; - -contract DeployLocal is Script { - using stdJson for string; - - function setUp() public {} - - function run() public { - HelperConfig helperConfig = new HelperConfig(""); - _deploy(helperConfig); - } - - function run(string calldata testnet) public { - HelperConfig helperConfig = new HelperConfig(testnet); - _deploy(helperConfig); - } - - function _deploy(HelperConfig helperConfig) public { - HelperConfig.GatewayConfig memory gatewayConfig = helperConfig.getGatewayConfig(); - HelperConfig.GatewayInitConfig memory gatewayInitConfig = helperConfig.getGatewayInitConfig(); - HelperConfig.BeefyClientConfig memory beefyClientConfig = helperConfig.getBeefyClientConfig(); - vm.startBroadcast(); - - BeefyClient beefyClient; - // BeefyClient - // Seems `fs_permissions` explicitly configured as absolute path does not work and only allowed from project root - { - string memory root = vm.projectRoot(); - string memory beefyCheckpointFile = string.concat(root, "/beefy-state.json"); - string memory beefyCheckpointRaw = vm.readFile(beefyCheckpointFile); - uint64 startBlock = uint64(beefyCheckpointRaw.readUint(".startBlock")); - - BeefyClient.ValidatorSet memory current = BeefyClient.ValidatorSet( - uint128(beefyCheckpointRaw.readUint(".current.id")), - uint128(beefyCheckpointRaw.readUint(".current.length")), - beefyCheckpointRaw.readBytes32(".current.root") - ); - BeefyClient.ValidatorSet memory next = BeefyClient.ValidatorSet( - uint128(beefyCheckpointRaw.readUint(".next.id")), - uint128(beefyCheckpointRaw.readUint(".next.length")), - beefyCheckpointRaw.readBytes32(".next.root") - ); - - beefyClient = new BeefyClient( - beefyClientConfig.randaoCommitDelay, - beefyClientConfig.randaoCommitExpiration, - beefyClientConfig.minimumSignatures, - startBlock, - current, - next - ); - } - - AgentExecutor executor = new AgentExecutor(); - Gateway gatewayLogic = new Gateway( - address(beefyClient), - address(executor), - gatewayConfig.bridgeHubParaID, - gatewayConfig.bridgeHubAgentID, - gatewayConfig.foreignTokenDecimals, - gatewayConfig.maxDestinationFee - ); - - OperatingMode defaultOperatingMode; - if (gatewayInitConfig.rejectOutboundMessages) { - defaultOperatingMode = OperatingMode.RejectingOutboundMessages; - } else { - defaultOperatingMode = OperatingMode.Normal; - } - - Gateway.Config memory config = Gateway.Config({ - mode: defaultOperatingMode, - deliveryCost: gatewayInitConfig.deliveryCost, - registerTokenFee: gatewayInitConfig.registerTokenFee, - assetHubParaID: gatewayInitConfig.assetHubParaID, - assetHubAgentID: gatewayInitConfig.assetHubAgentID, - assetHubCreateAssetFee: gatewayInitConfig.assetHubCreateAssetFee, - assetHubReserveTransferFee: gatewayInitConfig.assetHubReserveTransferFee, - exchangeRate: gatewayInitConfig.exchangeRate, - multiplier: gatewayInitConfig.multiplier, - rescueOperator: address(0) - }); - - GatewayProxy gateway = new GatewayProxy(address(gatewayLogic), abi.encode(config)); - console2.log("BeefyClient: ", address(beefyClient)); - console2.log("Gateway impl: ", address(gatewayLogic)); - console2.log("gateway address: ", address(gateway)); - - // Deploy WETH for testing - new WETH9(); - - // Fund the gateway proxy contract. Used to reward relayers. - uint256 initialDeposit = vm.envUint("GATEWAY_PROXY_INITIAL_DEPOSIT"); - - IGateway(address(gateway)).depositEther{value: initialDeposit}(); - - vm.stopBroadcast(); - } -} diff --git a/overridden_contracts/scripts/DeployLocalGateway.sol b/overridden_contracts/scripts/DeployLocalGateway.sol deleted file mode 100644 index 16fd341..0000000 --- a/overridden_contracts/scripts/DeployLocalGateway.sol +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.25; - -import {console2} from "forge-std/console2.sol"; -import {Script} from "forge-std/Script.sol"; -import {stdJson} from "forge-std/StdJson.sol"; - -import {GatewayProxy} from "../src/GatewayProxy.sol"; -import {Gateway} from "../src/Gateway.sol"; -import {OperatingMode} from "../src/Types.sol"; -import {HelperConfig} from "./HelperConfig.sol"; - -contract DeployLocal is Script { - using stdJson for string; - - function setUp() public {} - - function run() public { - HelperConfig helperConfig = new HelperConfig(""); - _deploy(helperConfig); - } - - function run(string calldata testnet) public { - HelperConfig helperConfig = new HelperConfig(testnet); - _deploy(helperConfig); - } - - function _deploy(HelperConfig helperConfig) private { - vm.startBroadcast(); - HelperConfig.GatewayConfig memory gatewayConfig = helperConfig.getGatewayConfig(); - HelperConfig.GatewayInitConfig memory gatewayInitConfig = helperConfig.getGatewayInitConfig(); - - Gateway gatewayLogic = new Gateway( - address(gatewayConfig.beefyClient), - address(gatewayConfig.agentExecutor), - gatewayConfig.bridgeHubParaID, - gatewayConfig.bridgeHubAgentID, - gatewayConfig.foreignTokenDecimals, - gatewayConfig.maxDestinationFee - ); - - OperatingMode defaultOperatingMode; - if (gatewayInitConfig.rejectOutboundMessages) { - defaultOperatingMode = OperatingMode.RejectingOutboundMessages; - } else { - defaultOperatingMode = OperatingMode.Normal; - } - - Gateway.Config memory config = Gateway.Config({ - mode: defaultOperatingMode, - deliveryCost: gatewayInitConfig.deliveryCost, - registerTokenFee: gatewayInitConfig.registerTokenFee, - assetHubParaID: gatewayInitConfig.assetHubParaID, - assetHubAgentID: gatewayInitConfig.assetHubAgentID, - assetHubCreateAssetFee: gatewayInitConfig.assetHubCreateAssetFee, - assetHubReserveTransferFee: gatewayInitConfig.assetHubReserveTransferFee, - exchangeRate: gatewayInitConfig.exchangeRate, - multiplier: gatewayInitConfig.multiplier, - rescueOperator: address(0) - }); - - GatewayProxy gateway = new GatewayProxy(address(gatewayLogic), abi.encode(config)); - console2.log("Gateway impl: ", address(gatewayLogic)); - console2.log("gateway address: ", address(gateway)); - vm.stopBroadcast(); - } -} diff --git a/overridden_contracts/scripts/HelperConfig.sol b/overridden_contracts/scripts/HelperConfig.sol deleted file mode 100644 index 71dbdf0..0000000 --- a/overridden_contracts/scripts/HelperConfig.sol +++ /dev/null @@ -1,153 +0,0 @@ -//SPDX-License-Identifier: GPL-3.0-or-later - -// Copyright (C) Moondance Labs Ltd. -// This file is part of Tanssi. -// Tanssi is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// Tanssi is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with Tanssi. If not, see -pragma solidity 0.8.25; - -import {console2, Script} from "forge-std/Script.sol"; -import {UD60x18, ud60x18} from "prb/math/src/UD60x18.sol"; -import {ParaID} from "../src/Types.sol"; - -contract HelperConfig is Script { - BeefyClientConfig public activeBeefyClientConfig; - GatewayConfig public activeGatewayConfig; - GatewayInitConfig public activeGatewayInitConfig; - - struct BeefyClientConfig { - uint256 randaoCommitDelay; - uint256 randaoCommitExpiration; - uint256 minimumSignatures; - } - - struct GatewayConfig { - address beefyClient; - address agentExecutor; - ParaID bridgeHubParaID; - bytes32 bridgeHubAgentID; - uint8 foreignTokenDecimals; - uint128 maxDestinationFee; - } - - struct GatewayInitConfig { - ParaID assetHubParaID; - bytes32 assetHubAgentID; - bool rejectOutboundMessages; - uint128 deliveryCost; - uint128 registerTokenFee; - uint128 assetHubCreateAssetFee; - uint128 assetHubReserveTransferFee; - UD60x18 exchangeRate; - UD60x18 multiplier; - } - - uint256 public DEFAULT_ANVIL_PRIVATE_KEY = 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6; - - constructor(string memory testnet) { - (activeBeefyClientConfig, activeGatewayConfig, activeGatewayInitConfig) = getChainConfig(testnet); - } - - function getBeefyClientConfig() public view returns (BeefyClientConfig memory beefyClientConfig) { - return activeBeefyClientConfig; - } - - function getGatewayConfig() public view returns (GatewayConfig memory gatewayConfig) { - return activeGatewayConfig; - } - - function getGatewayInitConfig() public view returns (GatewayInitConfig memory gatewayInitConfig) { - return activeGatewayInitConfig; - } - - function getChainConfig(string memory testnet) - public - view - returns ( - BeefyClientConfig memory beefyClientConfig, - GatewayConfig memory gatewayConfig, - GatewayInitConfig memory gatewayInitConfig - ) - { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/scripts/chain_data.json"); - string memory json = vm.readFile(path); - - //! Make sure chainid is present in the json or this will just revert without giving any information - uint256 chainId = block.chainid; - string memory jsonPath = string.concat("$.", vm.toString(chainId)); - if ( - ( - keccak256(abi.encodePacked(testnet)) == keccak256("stagelight") - || keccak256(abi.encodePacked(testnet)) == keccak256("dancelight") - ) && block.chainid == 11155111 - ) { - jsonPath = string.concat(jsonPath, string.concat(".", testnet)); - } - - beefyClientConfig = _loadBeefyClientConfig(json, jsonPath); - gatewayConfig = _loadGatewayConfig(json, jsonPath); - gatewayInitConfig = _loadGatewayInitConfig(json, jsonPath); - } - - function _loadBeefyClientConfig(string memory json, string memory jsonPath) - private - pure - returns (BeefyClientConfig memory beefyClientConfig) - { - beefyClientConfig = BeefyClientConfig({ - randaoCommitDelay: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".randomCommitDelay")), (uint256)), - randaoCommitExpiration: abi.decode( - vm.parseJson(json, string.concat(jsonPath, ".randaoCommitExpiration")), (uint256) - ), - minimumSignatures: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".minimumSignatures")), (uint256)) - }); - } - - function _loadGatewayConfig(string memory json, string memory jsonPath) - private - pure - returns (GatewayConfig memory gatewayConfig) - { - gatewayConfig = GatewayConfig({ - beefyClient: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".beefyClient")), (address)), - agentExecutor: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".agentExecutor")), (address)), - bridgeHubParaID: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".bridgeHubParaID")), (ParaID)), - bridgeHubAgentID: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".bridgeHubAgentID")), (bytes32)), - foreignTokenDecimals: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".foreignTokenDecimals")), (uint8)), - maxDestinationFee: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".maxDestinationFee")), (uint128)) - }); - } - - function _loadGatewayInitConfig(string memory json, string memory jsonPath) - private - pure - returns (GatewayInitConfig memory gatewayInitConfig) - { - gatewayInitConfig = GatewayInitConfig({ - assetHubParaID: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".assetHubParaID")), (ParaID)), - assetHubAgentID: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".assetHubAgentID")), (bytes32)), - rejectOutboundMessages: abi.decode( - vm.parseJson(json, string.concat(jsonPath, ".rejectOutboundMessages")), (bool) - ), - deliveryCost: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".deliveryCost")), (uint128)), - registerTokenFee: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".registerTokenFee")), (uint128)), - assetHubCreateAssetFee: abi.decode( - vm.parseJson(json, string.concat(jsonPath, ".assetHubCreateAssetFee")), (uint128) - ), - assetHubReserveTransferFee: abi.decode( - vm.parseJson(json, string.concat(jsonPath, ".assetHubReserveTransferFee")), (uint128) - ), - exchangeRate: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".exchangeRate")), (UD60x18)), - multiplier: abi.decode(vm.parseJson(json, string.concat(jsonPath, ".multiplier")), (UD60x18)) - }); - } -} diff --git a/overridden_contracts/scripts/chain_data.json b/overridden_contracts/scripts/chain_data.json deleted file mode 100644 index 121f079..0000000 --- a/overridden_contracts/scripts/chain_data.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "1": { - "beefyClient": "0x68cfb0df884e488e362690408231c316ed7348af", - "agentExecutor": "0xAD4a6D5DAe036fe490b34C08c7085C6B2Ae69969", - "bridgeHubParaID": 1, - "bridgeHubAgentID": "0x03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314", - "foreignTokenDecimals": 12, - "maxDestinationFee": 1000000000000000000, - "assetHubParaID": 1, - "assetHubAgentID": "0x9ba4d8cfc1cdf812338aa6457aa5510348526d933108b4106162474231b4cbe5", - "rejectOutboundMessages": false, - "deliveryCost": 695335506, - "registerTokenFee": 1000000000000000000, - "assetHubCreateAssetFee": 911996796338, - "assetHubReserveTransferFee": 540504664494, - "exchangeRate": 2500000000000000, - "multiplier": 1000000000000000000, - "randomCommitDelay": 3, - "randaoCommitExpiration": 8, - "minimumSignatures": 16 - }, - "31337": { - "beefyClient": "0x68cfb0df884e488e362690408231c316ed7348af", - "agentExecutor": "0xAD4a6D5DAe036fe490b34C08c7085C6B2Ae69969", - "bridgeHubParaID": 1, - "bridgeHubAgentID": "0x03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314", - "foreignTokenDecimals": 12, - "maxDestinationFee": 1000000000000000000, - "assetHubParaID": 1, - "assetHubAgentID": "0x9ba4d8cfc1cdf812338aa6457aa5510348526d933108b4106162474231b4cbe5", - "rejectOutboundMessages": false, - "deliveryCost": 695335506, - "registerTokenFee": 1000000000000000000, - "assetHubCreateAssetFee": 911996796338, - "assetHubReserveTransferFee": 540504664494, - "exchangeRate": 2500000000000000, - "multiplier": 1000000000000000000, - "randomCommitDelay": 3, - "randaoCommitExpiration": 8, - "minimumSignatures": 16 - }, - "11155111": { - "stagelight": { - "beefyClient": "0xD4C3B70Ac1547D66Bc89F8607C58Dd544412e8B7", - "agentExecutor": "0xd1668df5B8ff617De25544085aA126FCC9871559", - "bridgeHubParaID": 1, - "bridgeHubAgentID": "0x03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314", - "foreignTokenDecimals": 12, - "maxDestinationFee": 1000000000000000000, - "assetHubParaID": 1, - "assetHubAgentID": "0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6", - "rejectOutboundMessages": false, - "deliveryCost": 695335506, - "registerTokenFee": 1000000000000000000, - "assetHubCreateAssetFee": 911996796338, - "assetHubReserveTransferFee": 540504664494, - "exchangeRate": 2500000000000000, - "multiplier": 1000000000000000000, - "randomCommitDelay": 3, - "randaoCommitExpiration": 8, - "minimumSignatures": 16 - }, - "dancelight": { - "beefyClient": "0xe8dd26d2ec505ac7e51740da84ba2ce9f01a2431", - "agentExecutor": "0x5da02b29cDAFb72b4a2Ac9113e47aDdFde940c49", - "bridgeHubParaID": 1, - "bridgeHubAgentID": "0x03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314", - "foreignTokenDecimals": 12, - "maxDestinationFee": 1000000000000000000, - "assetHubParaID": 1, - "assetHubAgentID": "0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6", - "rejectOutboundMessages": false, - "deliveryCost": 695335506, - "registerTokenFee": 1000000000000000000, - "assetHubCreateAssetFee": 911996796338, - "assetHubReserveTransferFee": 540504664494, - "exchangeRate": 2500000000000000, - "multiplier": 1000000000000000000, - "randomCommitDelay": 3, - "randaoCommitExpiration": 8, - "minimumSignatures": 16 - } - } -} diff --git a/overridden_contracts/src/BeefyClient.sol b/overridden_contracts/src/BeefyClient.sol deleted file mode 100644 index 7ff0ac5..0000000 --- a/overridden_contracts/src/BeefyClient.sol +++ /dev/null @@ -1,622 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.25; - -import {ECDSA} from "openzeppelin/utils/cryptography/ECDSA.sol"; -import {SubstrateMerkleProof} from "./utils/SubstrateMerkleProof.sol"; -import {Bitfield} from "./utils/Bitfield.sol"; -import {Uint16Array, createUint16Array} from "./utils/Uint16Array.sol"; -import {Math} from "./utils/Math.sol"; -import {MMRProof} from "./utils/MMRProof.sol"; -import {ScaleCodec} from "./utils/ScaleCodec.sol"; - -/** - * @title BeefyClient - * - * High-level documentation at https://docs.snowbridge.network/architecture/verification/polkadot - * - * To submit new commitments, relayers must call the following methods sequentially: - * 1. submitInitial: Setup the session for the interactive submission - * 2. commitPrevRandao: Commit to a random seed for generating a validator subsampling - * 3. createFinalBitfield: Generate the validator subsampling - * 4. submitFinal: Complete submission after providing the request validator signatures - * - */ -contract BeefyClient { - using Math for uint16; - using Math for uint256; - - /* Events */ - - /** - * @dev Emitted when the MMR root is updated - * @param mmrRoot the updated MMR root - * @param blockNumber the beefy block number of the updated MMR root - */ - event NewMMRRoot(bytes32 mmrRoot, uint64 blockNumber); - - /** - * @dev Emitted when a new ticket has been created - * @param relayer The relayer who created the ticket - * @param blockNumber the parent block number of the candidate MMR root - */ - event NewTicket(address relayer, uint64 blockNumber); - - /* Types */ - - /** - * @dev The Commitment, with its payload, is the core thing we are trying to verify with - * this contract. It contains an MMR root that commits to the polkadot history, including - * past blocks and parachain blocks and can be used to verify both polkadot and parachain blocks. - */ - struct Commitment { - // Relay chain block number - uint32 blockNumber; - // ID of the validator set that signed the commitment - uint64 validatorSetID; - // The payload of the new commitment in beefy justifications (in - // our case, this is a new MMR root for all past polkadot blocks) - PayloadItem[] payload; - } - - /** - * @dev Each PayloadItem is a piece of data signed by validators at a particular block. - */ - struct PayloadItem { - // An ID that references a description of the data in the payload item. - // Known payload ids can be found [upstream](https://github.com/paritytech/substrate/blob/fe1f8ba1c4f23931ae89c1ada35efb3d908b50f5/primitives/consensus/beefy/src/payload.rs#L27). - bytes2 payloadID; - // The contents of the payload item - bytes data; - } - - /** - * @dev The ValidatorProof is a proof used to verify a commitment signature - */ - struct ValidatorProof { - // The parity bit to specify the intended solution - uint8 v; - // The x component on the secp256k1 curve - bytes32 r; - // The challenge solution - bytes32 s; - // Leaf index of the validator address in the merkle tree - uint256 index; - // Validator address - address account; - // Merkle proof for the validator - bytes32[] proof; - } - - /** - * @dev A ticket tracks working state for the interactive submission of new commitments - */ - struct Ticket { - // The block number this ticket was issued - uint64 blockNumber; - // Length of the validator set that signed the commitment - uint32 validatorSetLen; - // The number of signatures required - uint32 numRequiredSignatures; - // The PREVRANDAO seed selected for this ticket session - uint256 prevRandao; - // Hash of a bitfield claiming which validators have signed - bytes32 bitfieldHash; - } - - /// @dev The MMRLeaf describes the leaf structure of the MMR - struct MMRLeaf { - // Version of the leaf type - uint8 version; - // Parent number of the block this leaf describes - uint32 parentNumber; - // Parent hash of the block this leaf describes - bytes32 parentHash; - // Validator set id that will be part of consensus for the next block - uint64 nextAuthoritySetID; - // Length of that validator set - uint32 nextAuthoritySetLen; - // Merkle root of all public keys in that validator set - bytes32 nextAuthoritySetRoot; - // Merkle root of all parachain headers in this block - bytes32 parachainHeadsRoot; - // Message commitment - bytes32 messageCommitment; - } - - /** - * @dev The ValidatorSet describes a BEEFY validator set - */ - struct ValidatorSet { - // Identifier for the set - uint128 id; - // Number of validators in the set - uint128 length; - // Merkle root of BEEFY validator addresses - bytes32 root; - } - - /** - * @dev The ValidatorSetState describes a BEEFY validator set along with signature usage counters - */ - struct ValidatorSetState { - // Identifier for the set - uint128 id; - // Number of validators in the set - uint128 length; - // Merkle root of BEEFY validator addresses - bytes32 root; - // Number of times a validator signature has been used - Uint16Array usageCounters; - } - - /* State */ - - /// @dev The latest verified MMR root - bytes32 public latestMMRRoot; - - /// @dev The block number in the relay chain in which the latest MMR root was emitted - uint64 public latestBeefyBlock; - - /// @dev State of the current validator set - ValidatorSetState public currentValidatorSet; - - /// @dev State of the next validator set - ValidatorSetState public nextValidatorSet; - - /// @dev Pending tickets for commitment submission - mapping(bytes32 ticketID => Ticket) public tickets; - - /* Constants */ - - /** - * @dev Beefy payload id for MMR Root payload items: - * https://github.com/paritytech/substrate/blob/fe1f8ba1c4f23931ae89c1ada35efb3d908b50f5/primitives/consensus/beefy/src/payload.rs#L33 - */ - bytes2 public constant MMR_ROOT_ID = bytes2("mh"); - - /** - * @dev Minimum delay in number of blocks that a relayer must wait between calling - * submitInitial and commitPrevRandao. In production this should be set to MAX_SEED_LOOKAHEAD: - * https://eth2book.info/altair/part3/config/preset#max_seed_lookahead - */ - uint256 public immutable randaoCommitDelay; - - /** - * @dev after randaoCommitDelay is reached, relayer must - * call commitPrevRandao within this number of blocks. - * Without this expiration, relayers can roll the dice infinitely to get the subsampling - * they desire. - */ - uint256 public immutable randaoCommitExpiration; - - /** - * @dev Minimum number of signatures required to validate a new commitment. This parameter - * is calculated based on `randaoCommitExpiration`. See ~/scripts/beefy_signature_sampling.py - * for the calculation. - */ - uint256 public immutable minNumRequiredSignatures; - - /* Errors */ - error InvalidBitfield(); - error InvalidBitfieldLength(); - error InvalidCommitment(); - error InvalidMMRLeaf(); - error InvalidMMRLeafProof(); - error InvalidMMRRootLength(); - error InvalidSignature(); - error InvalidTicket(); - error InvalidValidatorProof(); - error InvalidValidatorProofLength(); - error CommitmentNotRelevant(); - error NotEnoughClaims(); - error PrevRandaoAlreadyCaptured(); - error PrevRandaoNotCaptured(); - error StaleCommitment(); - error TicketExpired(); - error WaitPeriodNotOver(); - - constructor( - uint256 _randaoCommitDelay, - uint256 _randaoCommitExpiration, - uint256 _minNumRequiredSignatures, - uint64 _initialBeefyBlock, - ValidatorSet memory _initialValidatorSet, - ValidatorSet memory _nextValidatorSet - ) { - if (_nextValidatorSet.id != _initialValidatorSet.id + 1) { - revert("invalid-constructor-params"); - } - randaoCommitDelay = _randaoCommitDelay; - randaoCommitExpiration = _randaoCommitExpiration; - minNumRequiredSignatures = _minNumRequiredSignatures; - latestBeefyBlock = _initialBeefyBlock; - currentValidatorSet.id = _initialValidatorSet.id; - currentValidatorSet.length = _initialValidatorSet.length; - currentValidatorSet.root = _initialValidatorSet.root; - currentValidatorSet.usageCounters = createUint16Array(currentValidatorSet.length); - nextValidatorSet.id = _nextValidatorSet.id; - nextValidatorSet.length = _nextValidatorSet.length; - nextValidatorSet.root = _nextValidatorSet.root; - nextValidatorSet.usageCounters = createUint16Array(nextValidatorSet.length); - } - - /* External Functions */ - - /** - * @dev Begin submission of commitment - * @param commitment contains the commitment signed by the validators - * @param bitfield a bitfield claiming which validators have signed the commitment - * @param proof a proof that a single validator from currentValidatorSet has signed the commitment - */ - function submitInitial(Commitment calldata commitment, uint256[] calldata bitfield, ValidatorProof calldata proof) - external - { - if (commitment.blockNumber <= latestBeefyBlock) { - revert StaleCommitment(); - } - - ValidatorSetState storage vset; - uint16 signatureUsageCount; - if (commitment.validatorSetID == currentValidatorSet.id) { - signatureUsageCount = currentValidatorSet.usageCounters.get(proof.index); - currentValidatorSet.usageCounters.set(proof.index, signatureUsageCount.saturatingAdd(1)); - vset = currentValidatorSet; - } else if (commitment.validatorSetID == nextValidatorSet.id) { - signatureUsageCount = nextValidatorSet.usageCounters.get(proof.index); - nextValidatorSet.usageCounters.set(proof.index, signatureUsageCount.saturatingAdd(1)); - vset = nextValidatorSet; - } else { - revert InvalidCommitment(); - } - - // Check if merkle proof is valid based on the validatorSetRoot and if proof is included in bitfield - if (!isValidatorInSet(vset, proof.account, proof.index, proof.proof) || !Bitfield.isSet(bitfield, proof.index)) - { - revert InvalidValidatorProof(); - } - - // Check if validatorSignature is correct, ie. check if it matches - // the signature of senderPublicKey on the commitmentHash - bytes32 commitmentHash = keccak256(encodeCommitment(commitment)); - if (ECDSA.recover(commitmentHash, proof.v, proof.r, proof.s) != proof.account) { - revert InvalidSignature(); - } - - // For the initial submission, the supplied bitfield should claim that more than - // two thirds of the validator set have sign the commitment - if (Bitfield.countSetBits(bitfield) < computeQuorum(vset.length)) { - revert NotEnoughClaims(); - } - - tickets[createTicketID(msg.sender, commitmentHash)] = Ticket({ - blockNumber: uint64(block.number), - validatorSetLen: uint32(vset.length), - numRequiredSignatures: uint32( - computeNumRequiredSignatures(vset.length, signatureUsageCount, minNumRequiredSignatures) - ), - prevRandao: 0, - bitfieldHash: keccak256(abi.encodePacked(bitfield)) - }); - - emit NewTicket(msg.sender, commitment.blockNumber); - } - - /** - * @dev Capture PREVRANDAO - * @param commitmentHash contains the commitmentHash signed by the validators - */ - function commitPrevRandao(bytes32 commitmentHash) external { - bytes32 ticketID = createTicketID(msg.sender, commitmentHash); - Ticket storage ticket = tickets[ticketID]; - - if (ticket.blockNumber == 0) { - revert InvalidTicket(); - } - - if (ticket.prevRandao != 0) { - revert PrevRandaoAlreadyCaptured(); - } - - // relayer must wait `randaoCommitDelay` blocks - if (block.number < ticket.blockNumber + randaoCommitDelay) { - revert WaitPeriodNotOver(); - } - - // relayer can capture within `randaoCommitExpiration` blocks - if (block.number > ticket.blockNumber + randaoCommitDelay + randaoCommitExpiration) { - delete tickets[ticketID]; - revert TicketExpired(); - } - - // Post-merge, the difficulty opcode now returns PREVRANDAO - ticket.prevRandao = block.prevrandao; - } - - /** - * @dev Submit a commitment and leaf for final verification - * @param commitment contains the full commitment that was used for the commitmentHash - * @param bitfield claiming which validators have signed the commitment - * @param proofs a struct containing the data needed to verify all validator signatures - * @param leaf an MMR leaf provable using the MMR root in the commitment payload - * @param leafProof an MMR leaf proof - * @param leafProofOrder a bitfield describing the order of each item (left vs right) - */ - function submitFinal( - Commitment calldata commitment, - uint256[] calldata bitfield, - ValidatorProof[] calldata proofs, - MMRLeaf calldata leaf, - bytes32[] calldata leafProof, - uint256 leafProofOrder - ) external { - bytes32 commitmentHash = keccak256(encodeCommitment(commitment)); - bytes32 ticketID = createTicketID(msg.sender, commitmentHash); - validateTicket(ticketID, commitment, bitfield); - - bool is_next_session = false; - ValidatorSetState storage vset; - if (commitment.validatorSetID == nextValidatorSet.id) { - is_next_session = true; - vset = nextValidatorSet; - } else if (commitment.validatorSetID == currentValidatorSet.id) { - vset = currentValidatorSet; - } else { - revert InvalidCommitment(); - } - - verifyCommitment(commitmentHash, ticketID, bitfield, vset, proofs); - - bytes32 newMMRRoot = ensureProvidesMMRRoot(commitment); - - if (is_next_session) { - if (leaf.nextAuthoritySetID != nextValidatorSet.id + 1) { - revert InvalidMMRLeaf(); - } - bool leafIsValid = - MMRProof.verifyLeafProof(newMMRRoot, keccak256(encodeMMRLeaf(leaf)), leafProof, leafProofOrder); - if (!leafIsValid) { - revert InvalidMMRLeafProof(); - } - currentValidatorSet = nextValidatorSet; - nextValidatorSet.id = leaf.nextAuthoritySetID; - nextValidatorSet.length = leaf.nextAuthoritySetLen; - nextValidatorSet.root = leaf.nextAuthoritySetRoot; - nextValidatorSet.usageCounters = createUint16Array(leaf.nextAuthoritySetLen); - } - - latestMMRRoot = newMMRRoot; - latestBeefyBlock = commitment.blockNumber; - delete tickets[ticketID]; - - emit NewMMRRoot(newMMRRoot, commitment.blockNumber); - } - - /** - * @dev Verify that the supplied MMR leaf is included in the latest verified MMR root. - * @param leafHash contains the merkle leaf to be verified - * @param proof contains simplified mmr proof - * @param proofOrder a bitfield describing the order of each item (left vs right) - */ - function verifyMMRLeafProof(bytes32 leafHash, bytes32[] calldata proof, uint256 proofOrder) - external - view - returns (bool) - { - return MMRProof.verifyLeafProof(latestMMRRoot, leafHash, proof, proofOrder); - } - - /** - * @dev Helper to create an initial validator bitfield. - * @param bitsToSet contains indexes of all signed validators, should be deduplicated - * @param length of validator set - */ - function createInitialBitfield(uint256[] calldata bitsToSet, uint256 length) - external - pure - returns (uint256[] memory) - { - if (length < bitsToSet.length) { - revert InvalidBitfieldLength(); - } - return Bitfield.createBitfield(bitsToSet, length); - } - - /** - * @dev Helper to create a final bitfield, with subsampled validator selections - * @param commitmentHash contains the commitmentHash signed by the validators - * @param bitfield claiming which validators have signed the commitment - */ - function createFinalBitfield(bytes32 commitmentHash, uint256[] calldata bitfield) - external - view - returns (uint256[] memory) - { - Ticket storage ticket = tickets[createTicketID(msg.sender, commitmentHash)]; - if (ticket.bitfieldHash != keccak256(abi.encodePacked(bitfield))) { - revert InvalidBitfield(); - } - return Bitfield.subsample(ticket.prevRandao, bitfield, ticket.numRequiredSignatures, ticket.validatorSetLen); - } - - /* Internal Functions */ - - // Creates a unique ticket ID for a new interactive prover-verifier session - function createTicketID(address account, bytes32 commitmentHash) internal pure returns (bytes32 value) { - assembly { - mstore(0x00, account) - mstore(0x20, commitmentHash) - value := keccak256(0x0, 0x40) - } - } - - /** - * @dev Calculates the number of required signatures for `submitFinal`. - * @param validatorSetLen The length of the validator set - * @param signatureUsageCount A counter of the number of times the validator signature was previously used in a call to `submitInitial` within the session. - * @param minRequiredSignatures The minimum amount of signatures to verify - */ - // For more details on the calculation, read the following: - // 1. https://docs.snowbridge.network/architecture/verification/polkadot#signature-sampling - // 2. https://hackmd.io/9OedC7icR5m-in_moUZ_WQ - function computeNumRequiredSignatures( - uint256 validatorSetLen, - uint256 signatureUsageCount, - uint256 minRequiredSignatures - ) internal pure returns (uint256) { - // Start with the minimum number of signatures. - uint256 numRequiredSignatures = minRequiredSignatures; - // Add signatures based on the number of validators in the validator set. - numRequiredSignatures += Math.log2(validatorSetLen, Math.Rounding.Ceil); - // Add signatures based on the signature usage count. - numRequiredSignatures += 1 + (2 * Math.log2(signatureUsageCount, Math.Rounding.Ceil)); - // Never require more signatures than a 2/3 majority - return Math.min(numRequiredSignatures, computeQuorum(validatorSetLen)); - } - - /** - * @dev Calculates 2/3 majority required for quorum for a given number of validators. - * @param numValidators The number of validators in the validator set. - */ - function computeQuorum(uint256 numValidators) internal pure returns (uint256) { - return numValidators - (numValidators - 1) / 3; - } - - /** - * @dev Verify commitment using the supplied signature proofs - */ - function verifyCommitment( - bytes32 commitmentHash, - bytes32 ticketID, - uint256[] calldata bitfield, - ValidatorSetState storage vset, - ValidatorProof[] calldata proofs - ) internal view { - Ticket storage ticket = tickets[ticketID]; - // Verify that enough signature proofs have been supplied - uint256 numRequiredSignatures = ticket.numRequiredSignatures; - if (proofs.length != numRequiredSignatures) { - revert InvalidValidatorProofLength(); - } - - // Generate final bitfield indicating which validators need to be included in the proofs. - uint256[] memory finalbitfield = - Bitfield.subsample(ticket.prevRandao, bitfield, numRequiredSignatures, vset.length); - - for (uint256 i = 0; i < proofs.length; i++) { - ValidatorProof calldata proof = proofs[i]; - - // Check that validator is in bitfield - if (!Bitfield.isSet(finalbitfield, proof.index)) { - revert InvalidValidatorProof(); - } - - // Check that validator is actually in a validator set - if (!isValidatorInSet(vset, proof.account, proof.index, proof.proof)) { - revert InvalidValidatorProof(); - } - - // Check that validator signed the commitment - if (ECDSA.recover(commitmentHash, proof.v, proof.r, proof.s) != proof.account) { - revert InvalidSignature(); - } - - // Ensure no validator can appear more than once in bitfield - Bitfield.unset(finalbitfield, proof.index); - } - } - - // Ensure that the commitment provides a new MMR root - function ensureProvidesMMRRoot(Commitment calldata commitment) internal pure returns (bytes32) { - for (uint256 i = 0; i < commitment.payload.length; i++) { - if (commitment.payload[i].payloadID == MMR_ROOT_ID) { - if (commitment.payload[i].data.length != 32) { - revert InvalidMMRRootLength(); - } else { - return bytes32(commitment.payload[i].data); - } - } - } - revert CommitmentNotRelevant(); - } - - function encodeCommitment(Commitment calldata commitment) internal pure returns (bytes memory) { - return bytes.concat( - encodeCommitmentPayload(commitment.payload), - ScaleCodec.encodeU32(commitment.blockNumber), - ScaleCodec.encodeU64(commitment.validatorSetID) - ); - } - - function encodeCommitmentPayload(PayloadItem[] calldata items) internal pure returns (bytes memory) { - bytes memory payload = ScaleCodec.checkedEncodeCompactU32(items.length); - for (uint256 i = 0; i < items.length; i++) { - payload = bytes.concat( - payload, items[i].payloadID, ScaleCodec.checkedEncodeCompactU32(items[i].data.length), items[i].data - ); - } - - return payload; - } - - function encodeMMRLeaf(MMRLeaf calldata leaf) internal pure returns (bytes memory) { - return bytes.concat( - ScaleCodec.encodeU8(leaf.version), - ScaleCodec.encodeU32(leaf.parentNumber), - leaf.parentHash, - ScaleCodec.encodeU64(leaf.nextAuthoritySetID), - ScaleCodec.encodeU32(leaf.nextAuthoritySetLen), - leaf.nextAuthoritySetRoot, - leaf.parachainHeadsRoot, - leaf.messageCommitment - ); - } - - /** - * @dev Checks if a validators address is a member of the merkle tree - * @param vset The validator set - * @param account The address of the validator to check for inclusion in `vset`. - * @param index The leaf index of the account in the merkle tree of validator set addresses. - * @param proof Merkle proof required for validation of the address - * @return true if the validator is in the set - */ - function isValidatorInSet(ValidatorSetState storage vset, address account, uint256 index, bytes32[] calldata proof) - internal - view - returns (bool) - { - bytes32 hashedLeaf = keccak256(abi.encodePacked(account)); - return SubstrateMerkleProof.verify(vset.root, hashedLeaf, index, vset.length, proof); - } - - /** - * @dev Basic validation of a ticket for submitFinal - */ - function validateTicket(bytes32 ticketID, Commitment calldata commitment, uint256[] calldata bitfield) - internal - view - { - Ticket storage ticket = tickets[ticketID]; - - if (ticket.blockNumber == 0) { - // submitInitial hasn't been called yet - revert InvalidTicket(); - } - - if (ticket.prevRandao == 0) { - // commitPrevRandao hasn't been called yet - revert PrevRandaoNotCaptured(); - } - - if (commitment.blockNumber <= latestBeefyBlock) { - // ticket is obsolete - revert StaleCommitment(); - } - - if (ticket.bitfieldHash != keccak256(abi.encodePacked(bitfield))) { - // The provided claims bitfield isn't the same one that was - // passed to submitInitial - revert InvalidBitfield(); - } - } -} diff --git a/overridden_contracts/src/Gateway.sol b/overridden_contracts/src/Gateway.sol deleted file mode 100644 index 5974d99..0000000 --- a/overridden_contracts/src/Gateway.sol +++ /dev/null @@ -1,911 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.25; - -import {MerkleProof} from "openzeppelin/utils/cryptography/MerkleProof.sol"; -import {Ownable} from "openzeppelin/access/Ownable.sol"; -import {Verification} from "./Verification.sol"; -import {Assets} from "./Assets.sol"; -import {AgentExecutor} from "./AgentExecutor.sol"; -import {Agent} from "./Agent.sol"; -import { - Channel, - ChannelID, - InboundMessage, - OperatingMode, - ParaID, - Command, - MultiAddress, - Ticket, - TokenInfo, - Costs, - AgentExecuteCommand -} from "./Types.sol"; -import {Upgrade} from "./Upgrade.sol"; -import {IInitializable} from "./interfaces/IInitializable.sol"; -import {IUpgradable} from "./interfaces/IUpgradable.sol"; -import {ERC1967} from "./utils/ERC1967.sol"; -import {Address} from "./utils/Address.sol"; -import {SafeNativeTransfer} from "./utils/SafeTransfer.sol"; -import {Call} from "./utils/Call.sol"; -import {Math} from "./utils/Math.sol"; -import {ScaleCodec} from "./utils/ScaleCodec.sol"; - -import { - AgentExecuteParams, - UpgradeParams, - CreateAgentParams, - CreateChannelParams, - UpdateChannelParams, - SetOperatingModeParams, - TransferNativeFromAgentParams, - SetTokenTransferFeesParams, - SetPricingParametersParams, - RegisterForeignTokenParams, - MintForeignTokenParams, - TransferNativeTokenParams -} from "./Params.sol"; - -import {CoreStorage} from "./storage/CoreStorage.sol"; -import {PricingStorage} from "./storage/PricingStorage.sol"; -import {AssetsStorage} from "./storage/AssetsStorage.sol"; -import {OperatorStorage} from "./storage/OperatorStorage.sol"; -import {GatewayCoreStorage} from "./storage/GatewayCoreStorage.sol"; - -import {UD60x18, ud60x18, convert} from "prb/math/src/UD60x18.sol"; - -import {Operators} from "./Operators.sol"; - -import {IOGateway} from "./interfaces/IOGateway.sol"; -import {IMiddlewareBasic} from "./interfaces/IMiddlewareBasic.sol"; - -contract Gateway is IOGateway, IInitializable, IUpgradable { - using Address for address; - using SafeNativeTransfer for address payable; - - address public immutable AGENT_EXECUTOR; - - // Verification state - address public immutable BEEFY_CLIENT; - - // BridgeHub - ParaID internal immutable BRIDGE_HUB_PARA_ID; - bytes4 internal immutable BRIDGE_HUB_PARA_ID_ENCODED; - bytes32 internal immutable BRIDGE_HUB_AGENT_ID; - - // ChannelIDs - ChannelID internal constant PRIMARY_GOVERNANCE_CHANNEL_ID = ChannelID.wrap(bytes32(uint256(1))); - ChannelID internal constant SECONDARY_GOVERNANCE_CHANNEL_ID = ChannelID.wrap(bytes32(uint256(2))); - - // Gas used for: - // 1. Mapping a command id to an implementation function - // 2. Calling implementation function - uint256 DISPATCH_OVERHEAD_GAS = 10_000; - - // The maximum fee that can be sent to a destination parachain to pay for execution (DOT). - // Has two functions: - // * Reduces the ability of users to perform arbitrage using a favourable exchange rate - // * Prevents users from mistakenly providing too much fees, which would drain AssetHub's - // sovereign account here on Ethereum. - uint128 internal immutable MAX_DESTINATION_FEE; - - uint8 internal immutable FOREIGN_TOKEN_DECIMALS; - - error InvalidProof(); - error InvalidNonce(); - error NotEnoughGas(); - error InsufficientEther(); - error Unauthorized(); - error Disabled(); - error AgentAlreadyCreated(); - error AgentDoesNotExist(); - error ChannelAlreadyCreated(); - error ChannelDoesNotExist(); - error InvalidChannelUpdate(); - error InvalidAgentExecutionPayload(); - error InvalidConstructorParams(); - error TokenNotRegistered(); - error CantSetMiddlewareToZeroAddress(); - error CantSetMiddlewareToSameAddress(); - error MiddlewareNotSet(); - error EUnableToProcessRewardsB( - uint256 epoch, - uint256 eraIndex, - address tokenAddress, - uint256 totalPointsToken, - uint256 totalTokensInflated, - bytes32 rewardsRoot, - bytes errorBytes - ); - error EUnableToProcessRewardsS( - uint256 epoch, - uint256 eraIndex, - address tokenAddress, - uint256 totalPointsToken, - uint256 totalTokensInflated, - bytes32 rewardsRoot, - string errorString - ); - - // Message handlers can only be dispatched by the gateway itself - modifier onlySelf() { - if (msg.sender != address(this)) { - revert Unauthorized(); - } - _; - } - - // Can only be called by the owner of the contract. - modifier onlyOwner() { - GatewayCoreStorage.Layout storage layout = GatewayCoreStorage.layout(); - if (msg.sender != layout.owner) { - revert Unauthorized(); - } - _; - } - - // Can only be called by the middleware - modifier onlyMiddleware() { - GatewayCoreStorage.Layout storage layout = GatewayCoreStorage.layout(); - if (msg.sender != layout.middleware) { - revert Unauthorized(); - } - _; - } - - constructor( - address beefyClient, - address agentExecutor, - ParaID bridgeHubParaID, - bytes32 bridgeHubAgentID, - uint8 foreignTokenDecimals, - uint128 maxDestinationFee - ) { - if (bridgeHubParaID == ParaID.wrap(0) || bridgeHubAgentID == 0) { - revert InvalidConstructorParams(); - } - - BEEFY_CLIENT = beefyClient; - AGENT_EXECUTOR = agentExecutor; - BRIDGE_HUB_PARA_ID_ENCODED = ScaleCodec.encodeU32(uint32(ParaID.unwrap(bridgeHubParaID))); - BRIDGE_HUB_PARA_ID = bridgeHubParaID; - BRIDGE_HUB_AGENT_ID = bridgeHubAgentID; - FOREIGN_TOKEN_DECIMALS = foreignTokenDecimals; - MAX_DESTINATION_FEE = maxDestinationFee; - } - - /// @dev Submit a message from Polkadot for verification and dispatch - /// @param message A message produced by the OutboundQueue pallet on BridgeHub - /// @param leafProof A message proof used to verify that the message is in the merkle tree committed by the OutboundQueue pallet - /// @param headerProof A proof that the commitment is included in parachain header that was finalized by BEEFY. - function submitV1( - InboundMessage calldata message, - bytes32[] calldata leafProof, - Verification.Proof calldata headerProof - ) external { - uint256 startGas = gasleft(); - - Channel storage channel = _ensureChannel(message.channelID); - - // Ensure this message is not being replayed - if (message.nonce != channel.inboundNonce + 1) { - revert InvalidNonce(); - } - - // Increment nonce for origin. - // This also prevents the re-entrancy case in which a malicious party tries to re-enter by calling `submitInbound` - // again with the same (message, leafProof, headerProof) arguments. - channel.inboundNonce++; - - // Produce the commitment (message root) by applying the leaf proof to the message leaf - bytes32 leafHash = keccak256(abi.encode(message)); - bytes32 commitment = MerkleProof.processProof(leafProof, leafHash); - - // Verify that the commitment is included in a parachain header finalized by BEEFY. - if (!_verifyCommitment(commitment, headerProof)) { - revert InvalidProof(); - } - - // Make sure relayers provide enough gas so that inner message dispatch - // does not run out of gas. - uint256 maxDispatchGas = message.maxDispatchGas; - if (gasleft() < maxDispatchGas + DISPATCH_OVERHEAD_GAS) { - revert NotEnoughGas(); - } - - bool success = true; - - // Dispatch message to a handler - if (message.command == Command.AgentExecute) { - try Gateway(this).agentExecute{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.CreateAgent) { - try Gateway(this).createAgent{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.CreateChannel) { - try Gateway(this).createChannel{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.UpdateChannel) { - try Gateway(this).updateChannel{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.SetOperatingMode) { - try Gateway(this).setOperatingMode{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.TransferNativeFromAgent) { - try Gateway(this).transferNativeFromAgent{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.Upgrade) { - try Gateway(this).upgrade{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.SetTokenTransferFees) { - try Gateway(this).setTokenTransferFees{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.SetPricingParameters) { - try Gateway(this).setPricingParameters{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.TransferNativeToken) { - try Gateway(this).transferNativeToken{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.RegisterForeignToken) { - try Gateway(this).registerForeignToken{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.MintForeignToken) { - try Gateway(this).mintForeignToken{gas: maxDispatchGas}(message.params) {} - catch { - success = false; - } - } else if (message.command == Command.ReportSlashes) { - // We need to put all this inside a generic try-catch, since we dont want to revert decoding nor anything - try Gateway(this).reportSlashes{gas: maxDispatchGas}(message.params) {} - catch Error(string memory err) { - emit UnableToProcessSlashMessageS(err); - success = false; - } catch (bytes memory err) { - emit UnableToProcessSlashMessageB(err); - success = false; - } - } else if (message.command == Command.ReportRewards) { - try Gateway(this).sendRewards{gas: maxDispatchGas}(message.params) {} - catch Error(string memory err) { - emit UnableToProcessRewardsMessageS(err); - success = false; - } catch (bytes memory err) { - emit UnableToProcessRewardsMessageB(err); - success = false; - } - } else { - success = false; - emit NotImplementedCommand(message.command); - } - - // Calculate a gas refund, capped to protect against huge spikes in `tx.gasprice` - // that could drain funds unnecessarily. During these spikes, relayers should back off. - uint256 gasUsed = _transactionBaseGas() + (startGas - gasleft()); - uint256 refund = gasUsed * Math.min(tx.gasprice, message.maxFeePerGas); - - // Add the reward to the refund amount. If the sum is more than the funds available - // in the channel agent, then reduce the total amount - uint256 amount = Math.min(refund + message.reward, address(this).balance); - - // Do the payment if there funds available in the gateway - if (amount > _dustThreshold()) { - payable(msg.sender).safeNativeTransfer(amount); - } - - emit InboundMessageDispatched(message.channelID, message.nonce, message.id, success); - } - - /** - * Getters - */ - function operatingMode() external view returns (OperatingMode) { - return CoreStorage.layout().mode; - } - - function channelOperatingModeOf(ChannelID channelID) external view returns (OperatingMode) { - Channel storage ch = _ensureChannel(channelID); - return ch.mode; - } - - function channelNoncesOf(ChannelID channelID) external view returns (uint64, uint64) { - Channel storage ch = _ensureChannel(channelID); - return (ch.inboundNonce, ch.outboundNonce); - } - - function agentOf(bytes32 agentID) external view returns (address) { - return _ensureAgent(agentID); - } - - function pricingParameters() external view returns (UD60x18, uint128) { - PricingStorage.Layout storage pricing = PricingStorage.layout(); - return (pricing.exchangeRate, pricing.deliveryCost); - } - - function implementation() public view returns (address) { - return ERC1967.load(); - } - - /** - * Fee management - */ - function depositEther() external payable { - emit Deposited(msg.sender, msg.value); - } - - /** - * Handlers - */ - - // Execute code within an agent - function agentExecute(bytes calldata data) external onlySelf { - AgentExecuteParams memory params = abi.decode(data, (AgentExecuteParams)); - - address agent = _ensureAgent(params.agentID); - - if (params.payload.length == 0) { - revert InvalidAgentExecutionPayload(); - } - - (AgentExecuteCommand command, bytes memory commandParams) = - abi.decode(params.payload, (AgentExecuteCommand, bytes)); - if (command == AgentExecuteCommand.TransferToken) { - (address token, address recipient, uint128 amount) = abi.decode(commandParams, (address, address, uint128)); - Assets.transferNativeToken(AGENT_EXECUTOR, agent, token, recipient, amount); - } - } - - /// @dev Create an agent for a consensus system on Polkadot - function createAgent(bytes calldata data) external onlySelf { - CoreStorage.Layout storage $ = CoreStorage.layout(); - - CreateAgentParams memory params = abi.decode(data, (CreateAgentParams)); - - // Ensure we don't overwrite an existing agent - if (address($.agents[params.agentID]) != address(0)) { - revert AgentAlreadyCreated(); - } - - address payable agent = payable(new Agent(params.agentID)); - $.agents[params.agentID] = agent; - - emit AgentCreated(params.agentID, agent); - } - - /// @dev Create a messaging channel for a Polkadot parachain - function createChannel(bytes calldata data) external onlySelf { - CoreStorage.Layout storage $ = CoreStorage.layout(); - - CreateChannelParams memory params = abi.decode(data, (CreateChannelParams)); - - // Ensure that specified agent actually exists - address agent = _ensureAgent(params.agentID); - - // Ensure channel has not already been created - Channel storage ch = $.channels[params.channelID]; - if (address(ch.agent) != address(0)) { - revert ChannelAlreadyCreated(); - } - - ch.mode = params.mode; - ch.agent = agent; - ch.inboundNonce = 0; - ch.outboundNonce = 0; - - emit ChannelCreated(params.channelID); - } - - /// @dev Update the configuration for a channel - function updateChannel(bytes calldata data) external onlySelf { - UpdateChannelParams memory params = abi.decode(data, (UpdateChannelParams)); - - Channel storage ch = _ensureChannel(params.channelID); - - // Extra sanity checks when updating the primary governance channel, which should never be halted. - if (params.channelID == PRIMARY_GOVERNANCE_CHANNEL_ID && (params.mode != OperatingMode.Normal)) { - revert InvalidChannelUpdate(); - } - - ch.mode = params.mode; - emit ChannelUpdated(params.channelID); - } - - /// Performs upgrade through the owner - function upgradeOnlyOwner(bytes calldata data) external onlyOwner { - Gateway(this).upgrade(data); - } - - /// @dev Perform an upgrade of the gateway - function upgrade(bytes calldata data) external onlySelf { - UpgradeParams memory params = abi.decode(data, (UpgradeParams)); - Upgrade.upgrade(params.impl, params.implCodeHash, params.initParams); - } - - // @dev Set the operating mode of the gateway - function setOperatingMode(bytes calldata data) external onlySelf { - CoreStorage.Layout storage $ = CoreStorage.layout(); - SetOperatingModeParams memory params = abi.decode(data, (SetOperatingModeParams)); - $.mode = params.mode; - emit OperatingModeChanged(params.mode); - } - - // @dev Transfer funds from an agent to a recipient account - function transferNativeFromAgent(bytes calldata data) external onlySelf { - TransferNativeFromAgentParams memory params = abi.decode(data, (TransferNativeFromAgentParams)); - - address agent = _ensureAgent(params.agentID); - - _transferNativeFromAgent(agent, payable(params.recipient), params.amount); - emit AgentFundsWithdrawn(params.agentID, params.recipient, params.amount); - } - - // @dev Set token fees of the gateway - function setTokenTransferFees(bytes calldata data) external onlySelf { - AssetsStorage.Layout storage $ = AssetsStorage.layout(); - SetTokenTransferFeesParams memory params = abi.decode(data, (SetTokenTransferFeesParams)); - $.assetHubCreateAssetFee = params.assetHubCreateAssetFee; - $.assetHubReserveTransferFee = params.assetHubReserveTransferFee; - $.registerTokenFee = params.registerTokenFee; - emit TokenTransferFeesChanged(); - } - - // @dev Set pricing params of the gateway - function setPricingParameters(bytes calldata data) external onlySelf { - PricingStorage.Layout storage pricing = PricingStorage.layout(); - SetPricingParametersParams memory params = abi.decode(data, (SetPricingParametersParams)); - pricing.exchangeRate = params.exchangeRate; - pricing.deliveryCost = params.deliveryCost; - pricing.multiplier = params.multiplier; - emit PricingParametersChanged(); - } - - /** - * Assets - */ - // @dev Register a new fungible Polkadot token for an agent - function registerForeignToken(bytes calldata data) external onlySelf { - RegisterForeignTokenParams memory params = abi.decode(data, (RegisterForeignTokenParams)); - Assets.registerForeignToken(params.foreignTokenID, params.name, params.symbol, params.decimals); - } - - // @dev Mint foreign token from polkadot - function mintForeignToken(bytes calldata data) external onlySelf { - MintForeignTokenParams memory params = abi.decode(data, (MintForeignTokenParams)); - Assets.mintForeignToken(params.foreignTokenID, params.recipient, params.amount); - } - - // @dev Transfer Ethereum native token back from polkadot - function transferNativeToken(bytes calldata data) external onlySelf { - TransferNativeTokenParams memory params = abi.decode(data, (TransferNativeTokenParams)); - address agent = _ensureAgent(params.agentID); - Assets.transferNativeToken(AGENT_EXECUTOR, agent, params.token, params.recipient, params.amount); - } - - // @dev Mint foreign token from polkadot - function reportSlashes(bytes calldata data) external onlySelf { - GatewayCoreStorage.Layout storage layout = GatewayCoreStorage.layout(); - address middlewareAddress = layout.middleware; - // Dont process message if we dont have a middleware set - if (middlewareAddress == address(0)) { - revert MiddlewareNotSet(); - } - - // Decode - (IOGateway.SlashParams memory slashes) = abi.decode(data, (IOGateway.SlashParams)); - IMiddlewareBasic middleware = IMiddlewareBasic(middlewareAddress); - - // At most it will be 10, defined by - // https://github.com/moondance-labs/tanssi/blob/88e59e6e5afb198947690487f286b9ad7cd4cde6/chains/orchestrator-relays/runtime/dancelight/src/lib.rs#L1446 - for (uint256 i = 0; i < slashes.slashes.length; ++i) { - Slash memory slash = slashes.slashes[i]; - //TODO maxDispatchGas should be probably be defined for all slashes, not only for one - try middleware.slash(uint48(slash.epoch), slash.operatorKey, slash.slashFraction) {} - catch Error(string memory err) { - emit UnableToProcessIndividualSlashS(slash.operatorKey, slash.slashFraction, slash.epoch, err); - continue; - } catch (bytes memory err) { - emit UnableToProcessIndividualSlashB(slash.operatorKey, slash.slashFraction, slash.epoch, err); - continue; - } - } - } - - function sendRewards(bytes calldata data) external onlySelf { - GatewayCoreStorage.Layout storage layout = GatewayCoreStorage.layout(); - address middlewareAddress = layout.middleware; - // Dont process message if we dont have a middleware set - if (middlewareAddress == address(0)) { - revert MiddlewareNotSet(); - } - - ( - uint256 epoch, - uint256 eraIndex, - uint256 totalPointsToken, - uint256 totalTokensInflated, - bytes32 rewardsRoot, - bytes32 foreignTokenId - ) = abi.decode(data, (uint256, uint256, uint256, uint256, bytes32, bytes32)); - - Assets.mintForeignToken(foreignTokenId, middlewareAddress, totalTokensInflated); - - address tokenAddress = Assets.tokenAddressOf(foreignTokenId); - - try IMiddlewareBasic(middlewareAddress).distributeRewards( - epoch, eraIndex, totalPointsToken, totalTokensInflated, rewardsRoot, tokenAddress - ) {} catch Error(string memory err) { - revert EUnableToProcessRewardsS( - epoch, eraIndex, tokenAddress, totalPointsToken, totalTokensInflated, rewardsRoot, err - ); - } catch (bytes memory err) { - revert EUnableToProcessRewardsB( - epoch, eraIndex, tokenAddress, totalPointsToken, totalTokensInflated, rewardsRoot, err - ); - } - } - - function isTokenRegistered(address token) external view returns (bool) { - return Assets.isTokenRegistered(token); - } - - function queryForeignTokenID(address token) external view returns (bytes32) { - return AssetsStorage.layout().tokenRegistry[token].foreignID; - } - - // Total fee for registering a token - function quoteRegisterTokenFee() external view returns (uint256) { - return _calculateFee(Assets.registerTokenCosts()); - } - - // Register an Ethereum-native token in the gateway and on AssetHub - function registerToken(address token) external payable { - _submitOutbound(Assets.registerToken(token)); - } - - // Total fee for sending a token - function quoteSendTokenFee(address token, ParaID destinationChain, uint128 destinationFee) - external - view - returns (uint256) - { - return _calculateFee(Assets.sendTokenCosts(token, destinationChain, destinationFee, MAX_DESTINATION_FEE)); - } - - // Transfer ERC20 tokens to a Polkadot parachain - function sendToken( - address token, - ParaID destinationChain, - MultiAddress calldata destinationAddress, - uint128 destinationFee, - uint128 amount - ) external payable { - Ticket memory ticket = Assets.sendToken( - token, msg.sender, destinationChain, destinationAddress, destinationFee, MAX_DESTINATION_FEE, amount - ); - - _submitOutbound(ticket); - } - - // @dev Get token address by tokenID - function tokenAddressOf(bytes32 tokenID) external view returns (address) { - return Assets.tokenAddressOf(tokenID); - } - - function sendOperatorsData(bytes32[] calldata data, uint48 epoch) external onlyMiddleware { - Ticket memory ticket = Operators.encodeOperatorsData(data, epoch); - _submitOutboundToChannel(PRIMARY_GOVERNANCE_CHANNEL_ID, ticket.payload); - } - - /** - * Internal functions - */ - - // Best-effort attempt at estimating the base gas use of `submitInbound` transaction, outside the block of - // code that is metered. - // This includes: - // * Cost paid for every transaction: 21000 gas - // * Cost of calldata: Zero byte = 4 gas, Non-zero byte = 16 gas - // * Cost of code inside submitInitial that is not metered: 14_698 - // - // The major cost of calldata are the merkle proofs, which should dominate anything else (including the message payload) - // Since the merkle proofs are hashes, they are much more likely to be composed of more non-zero bytes than zero bytes. - // - // Reference: Ethereum Yellow Paper - function _transactionBaseGas() internal pure returns (uint256) { - return 21_000 + 14_698 + (msg.data.length * 16); - } - - // Verify that a message commitment is considered finalized by our BEEFY light client. - function _verifyCommitment(bytes32 commitment, Verification.Proof calldata proof) - internal - view - virtual - returns (bool) - { - return Verification.verifyCommitment(BEEFY_CLIENT, BRIDGE_HUB_PARA_ID_ENCODED, commitment, proof); - } - - // Convert foreign currency to native currency (ROC/KSM/DOT -> ETH) - function _convertToNative(UD60x18 exchangeRate, UD60x18 multiplier, UD60x18 amount) - internal - view - returns (uint256) - { - UD60x18 ethDecimals = convert(1e18); - UD60x18 foreignDecimals = convert(10).pow(convert(uint256(FOREIGN_TOKEN_DECIMALS))); - UD60x18 nativeAmount = multiplier.mul(amount).mul(exchangeRate).div(foreignDecimals).mul(ethDecimals); - return convert(nativeAmount); - } - - // Calculate the fee for accepting an outbound message - function _calculateFee(Costs memory costs) internal view returns (uint256) { - PricingStorage.Layout storage pricing = PricingStorage.layout(); - UD60x18 amount = convert(pricing.deliveryCost + costs.foreign); - return costs.native + _convertToNative(pricing.exchangeRate, pricing.multiplier, amount); - } - - // Submit an outbound message to Polkadot, after taking fees - function _submitOutbound(Ticket memory ticket) internal { - ChannelID channelID = ticket.dest.into(); - Channel storage channel = _ensureChannel(channelID); - - // Ensure outbound messaging is allowed - _ensureOutboundMessagingEnabled(channel); - - // Destination fee always in DOT - uint256 fee = _calculateFee(ticket.costs); - - // Ensure the user has provided enough ether for this message to be accepted. - // This includes: - // 1. The bridging fee, which is collected in this gateway contract - // 2. The ether value being bridged over to Polkadot, which is locked into the AssetHub - // agent contract. - uint256 totalEther = fee + ticket.value; - if (msg.value < totalEther) { - revert InsufficientEther(); - } - if (ticket.value > 0) { - payable(AssetsStorage.layout().assetHubAgent).safeNativeTransfer(ticket.value); - } - - channel.outboundNonce = channel.outboundNonce + 1; - - // The fee is already collected into the gateway contract - // Reimburse excess fee payment - uint256 excessFee = msg.value - totalEther; - if (excessFee > _dustThreshold()) { - payable(msg.sender).safeNativeTransfer(excessFee); - } - - // Generate a unique ID for this message - bytes32 messageID = keccak256(abi.encodePacked(channelID, channel.outboundNonce)); - - emit OutboundMessageAccepted(channelID, channel.outboundNonce, messageID, ticket.payload); - } - - // Submit an outbound message to a specific channel. - // Doesn't handle fees. - function _submitOutboundToChannel(ChannelID channelID, bytes memory payload) internal { - Channel storage channel = _ensureChannel(channelID); - - // Ensure outbound messaging is allowed - _ensureOutboundMessagingEnabled(channel); - - // Increase channel nonce - channel.outboundNonce = channel.outboundNonce + 1; - - // Generate a unique ID for this message - bytes32 messageID = keccak256(abi.encodePacked(channelID, channel.outboundNonce)); - - // Emit event for bridge - emit OutboundMessageAccepted(channelID, channel.outboundNonce, messageID, payload); - } - - /// @dev Outbound message can be disabled globally or on a per-channel basis. - function _ensureOutboundMessagingEnabled(Channel storage ch) internal view { - CoreStorage.Layout storage $ = CoreStorage.layout(); - if ($.mode != OperatingMode.Normal || ch.mode != OperatingMode.Normal) { - revert Disabled(); - } - } - - /// @dev Ensure that the specified parachain has a channel allocated - function _ensureChannel(ChannelID channelID) internal view returns (Channel storage ch) { - ch = CoreStorage.layout().channels[channelID]; - // A channel always has an agent specified. - if (ch.agent == address(0)) { - revert ChannelDoesNotExist(); - } - } - - /// @dev Ensure that the specified agentID has a corresponding contract - function _ensureAgent(bytes32 agentID) internal view returns (address agent) { - agent = CoreStorage.layout().agents[agentID]; - if (agent == address(0)) { - revert AgentDoesNotExist(); - } - } - - /// @dev Invoke some code within an agent - function _invokeOnAgent(address agent, bytes memory data) internal returns (bytes memory) { - (bool success, bytes memory returndata) = (Agent(payable(agent)).invoke(AGENT_EXECUTOR, data)); - return Call.verifyResult(success, returndata); - } - - /// @dev Transfer ether from an agent - function _transferNativeFromAgent(address agent, address payable recipient, uint256 amount) internal { - bytes memory call = abi.encodeCall(AgentExecutor.transferEther, (recipient, amount)); - _invokeOnAgent(agent, call); - } - - /// @dev Define the dust threshold as the minimum cost to transfer ether between accounts - function _dustThreshold() internal view returns (uint256) { - return 21_000 * tx.gasprice; - } - - /** - * Upgrades - */ - - // Initial configuration for bridge - struct Config { - OperatingMode mode; - /// @dev The fee charged to users for submitting outbound messages (DOT) - uint128 deliveryCost; - /// @dev The ETH/DOT exchange rate - UD60x18 exchangeRate; - ParaID assetHubParaID; - bytes32 assetHubAgentID; - /// @dev The extra fee charged for registering tokens (DOT) - uint128 assetHubCreateAssetFee; - /// @dev The extra fee charged for sending tokens (DOT) - uint128 assetHubReserveTransferFee; - /// @dev extra fee to discourage spamming - uint256 registerTokenFee; - /// @dev Fee multiplier - UD60x18 multiplier; - /// @dev Optional rescueOperator - address rescueOperator; - } - - /// Initialize storage within the `GatewayProxy` contract using this initializer. - /// - /// This initializer cannot be called externally via the proxy as the function selector - /// is overshadowed in the proxy. - /// - /// This implementation is only intended to initialize storage for initial deployments - /// of the `GatewayProxy` contract to transient or long-lived testnets. - /// - /// The `GatewayProxy` deployed to Ethereum mainnet already has its storage initialized. - /// When its logic contract needs to upgraded, a new logic contract should be developed - /// that inherits from this base `Gateway` contract. Particularly, the `initialize` function - /// must be overriden to ensure selective initialization of storage fields relevant - /// to the upgrade. - /// - /// ```solidity - /// contract Gateway202508 is Gateway { - /// function initialize(bytes calldata data) external override { - /// if (ERC1967.load() == address(0)) { - /// revert Unauthorized(); - /// } - /// # Initialization routines here... - /// } - /// } - /// ``` - /// - function initialize(bytes calldata data) external virtual { - // Ensure that arbitrary users cannot initialize storage in this logic contract. - if (ERC1967.load() == address(0)) { - revert Unauthorized(); - } - - CoreStorage.Layout storage core = CoreStorage.layout(); - - Config memory config = abi.decode(data, (Config)); - - _transferOwnership(msg.sender); - - core.mode = config.mode; - - // Initialize agent for BridgeHub - address bridgeHubAgent = address(new Agent(BRIDGE_HUB_AGENT_ID)); - core.agents[BRIDGE_HUB_AGENT_ID] = bridgeHubAgent; - core.agentAddresses[bridgeHubAgent] = BRIDGE_HUB_AGENT_ID; - - // Initialize channel for primary governance track - core.channels[PRIMARY_GOVERNANCE_CHANNEL_ID] = - Channel({mode: OperatingMode.Normal, agent: bridgeHubAgent, inboundNonce: 0, outboundNonce: 0}); - - // Initialize channel for secondary governance track - core.channels[SECONDARY_GOVERNANCE_CHANNEL_ID] = - Channel({mode: OperatingMode.Normal, agent: bridgeHubAgent, inboundNonce: 0, outboundNonce: 0}); - - // Initialize agent for for AssetHub - address assetHubAgent = address(new Agent(config.assetHubAgentID)); - core.agents[config.assetHubAgentID] = assetHubAgent; - core.agentAddresses[assetHubAgent] = config.assetHubAgentID; - - // Initialize channel for AssetHub - core.channels[config.assetHubParaID.into()] = - Channel({mode: OperatingMode.Normal, agent: assetHubAgent, inboundNonce: 0, outboundNonce: 0}); - - // Initialize pricing storage - PricingStorage.Layout storage pricing = PricingStorage.layout(); - pricing.exchangeRate = config.exchangeRate; - pricing.deliveryCost = config.deliveryCost; - pricing.multiplier = config.multiplier; - - // Initialize assets storage - AssetsStorage.Layout storage assets = AssetsStorage.layout(); - - assets.assetHubParaID = config.assetHubParaID; - assets.assetHubAgent = assetHubAgent; - assets.registerTokenFee = config.registerTokenFee; - assets.assetHubCreateAssetFee = config.assetHubCreateAssetFee; - assets.assetHubReserveTransferFee = config.assetHubReserveTransferFee; - - // Register native Ether - TokenInfo storage etherTokenInfo = assets.tokenRegistry[address(0)]; - etherTokenInfo.isRegistered = true; - - // Initialize operator storage - OperatorStorage.Layout storage operatorStorage = OperatorStorage.layout(); - operatorStorage.operator = config.rescueOperator; - } - - function _transferOwnership(address newOwner) internal { - GatewayCoreStorage.Layout storage layout = GatewayCoreStorage.layout(); - - address oldOwner = layout.owner; - layout.owner = newOwner; - - emit OwnershipTransferred(oldOwner, newOwner); - } - - function transferOwnership(address newOwner) external onlyOwner { - _transferOwnership(newOwner); - } - - /// Changes the middleware address. - function setMiddleware(address middleware) external onlyOwner { - GatewayCoreStorage.Layout storage layout = GatewayCoreStorage.layout(); - address oldMiddleware = layout.middleware; - - if (middleware == address(0)) { - revert CantSetMiddlewareToZeroAddress(); - } - - if (middleware == oldMiddleware) { - revert CantSetMiddlewareToSameAddress(); - } - - layout.middleware = middleware; - emit MiddlewareChanged(oldMiddleware, middleware); - } - - function s_middleware() external view returns (address) { - GatewayCoreStorage.Layout storage layout = GatewayCoreStorage.layout(); - return layout.middleware; - } -} diff --git a/overridden_contracts/src/Operators.sol b/overridden_contracts/src/Operators.sol deleted file mode 100644 index af24733..0000000 --- a/overridden_contracts/src/Operators.sol +++ /dev/null @@ -1,53 +0,0 @@ -//SPDX-License-Identifier: GPL-3.0-or-later - -// Copyright (C) Moondance Labs Ltd. -// This file is part of Tanssi. -// Tanssi is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// Tanssi is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with Tanssi. If not, see -pragma solidity 0.8.25; - -import {console2} from "forge-std/console2.sol"; -import {BeefyClient} from "./BeefyClient.sol"; -import {ScaleCodec} from "./utils/ScaleCodec.sol"; -import {OSubstrateTypes} from "./libraries/OSubstrateTypes.sol"; -import {MultiAddress, Ticket, Costs, ParaID} from "./Types.sol"; - -import {IOGateway} from "./interfaces/IOGateway.sol"; - -library Operators { - error Operators__OperatorsLengthTooLong(); - error Operators__OperatorsKeysCannotBeEmpty(); - - uint16 private constant MAX_OPERATORS = 1000; - - function encodeOperatorsData(bytes32[] calldata operatorsKeys, uint48 epoch) - internal - returns (Ticket memory ticket) - { - if (operatorsKeys.length == 0) { - revert Operators__OperatorsKeysCannotBeEmpty(); - } - uint256 validatorsKeysLength = operatorsKeys.length; - - if (validatorsKeysLength > MAX_OPERATORS) { - revert Operators__OperatorsLengthTooLong(); - } - - // TODO: This is a type from Snowbridge, do we want our own simplified Ticket type? - ticket.dest = ParaID.wrap(0); - // TODO For now mock it to 0 - ticket.costs = Costs(0, 0); - - ticket.payload = - OSubstrateTypes.EncodedOperatorsData(abi.encodePacked(operatorsKeys), uint32(validatorsKeysLength), epoch); - emit IOGateway.OperatorsDataCreated(validatorsKeysLength, ticket.payload); - } -} diff --git a/overridden_contracts/src/Types.sol b/overridden_contracts/src/Types.sol deleted file mode 100644 index 448fef7..0000000 --- a/overridden_contracts/src/Types.sol +++ /dev/null @@ -1,151 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.25; - -import { - MultiAddress, multiAddressFromUint32, multiAddressFromBytes32, multiAddressFromBytes20 -} from "./MultiAddress.sol"; - -import {UD60x18} from "prb/math/src/UD60x18.sol"; - -type ParaID is uint32; - -using {ParaIDEq as ==, ParaIDNe as !=, into} for ParaID global; - -function ParaIDEq(ParaID a, ParaID b) pure returns (bool) { - return ParaID.unwrap(a) == ParaID.unwrap(b); -} - -function ParaIDNe(ParaID a, ParaID b) pure returns (bool) { - return !ParaIDEq(a, b); -} - -function into(ParaID paraID) pure returns (ChannelID) { - return ChannelID.wrap(keccak256(abi.encodePacked("para", ParaID.unwrap(paraID)))); -} - -type ChannelID is bytes32; - -using {ChannelIDEq as ==, ChannelIDNe as !=} for ChannelID global; - -function ChannelIDEq(ChannelID a, ChannelID b) pure returns (bool) { - return ChannelID.unwrap(a) == ChannelID.unwrap(b); -} - -function ChannelIDNe(ChannelID a, ChannelID b) pure returns (bool) { - return !ChannelIDEq(a, b); -} - -/// @dev A messaging channel for a Polkadot parachain -struct Channel { - /// @dev The operating mode for this channel. Can be used to - /// disable messaging on a per-channel basis. - OperatingMode mode; - /// @dev The current nonce for the inbound lane - uint64 inboundNonce; - /// @dev The current node for the outbound lane - uint64 outboundNonce; - /// @dev The address of the agent of the parachain owning this channel - address agent; -} - -/// @dev Inbound message from a Polkadot parachain (via BridgeHub) -struct InboundMessage { - /// @dev The parachain from which this message originated - ChannelID channelID; - /// @dev The channel nonce - uint64 nonce; - /// @dev The command to execute - Command command; - /// @dev The Parameters for the command - bytes params; - /// @dev The maximum gas allowed for message dispatch - uint64 maxDispatchGas; - /// @dev The maximum fee per gas - uint256 maxFeePerGas; - /// @dev The reward for message submission - uint256 reward; - /// @dev ID for this message - bytes32 id; -} - -enum OperatingMode { - Normal, - RejectingOutboundMessages -} - -/// @dev Messages from Polkadot take the form of these commands. -enum Command { - AgentExecute, - Upgrade, - CreateAgent, - CreateChannel, - UpdateChannel, - SetOperatingMode, - TransferNativeFromAgent, - SetTokenTransferFees, - SetPricingParameters, - TransferNativeToken, - RegisterForeignToken, - MintForeignToken, - /// @dev Below enums are reserved in case upstream snowbridge adds more commands - Reserved12, - Reserved13, - Reserved14, - Reserved15, - Reserved16, - Reserved17, - Reserved18, - Reserved19, - Reserved20, - Reserved21, - Reserved22, - Reserved23, - Reserved24, - Reserved25, - Reserved26, - Reserved27, - Reserved28, - Reserved29, - Reserved30, - Reserved31, - Test, - ReportRewards, - ReportSlashes -} - -/// @dev DEPRECATED -enum AgentExecuteCommand { - TransferToken -} - -/// @dev Application-level costs for a message -struct Costs { - /// @dev Costs in foreign currency - uint256 foreign; - /// @dev Costs in native currency - uint256 native; -} - -struct Ticket { - ParaID dest; - Costs costs; - bytes payload; - // amount of native ether to be sent - uint128 value; -} - -struct TokenInfo { - bool isRegistered; - bytes32 foreignID; -} - -using {isNativeToken} for TokenInfo global; - -function isNativeToken(TokenInfo storage info) view returns (bool) { - return info.foreignID == bytes32(0); -} - -function isForeignToken(TokenInfo storage info) view returns (bool) { - return !info.isNativeToken(); -} diff --git a/overridden_contracts/src/Verification.sol b/overridden_contracts/src/Verification.sol deleted file mode 100644 index 443001b..0000000 --- a/overridden_contracts/src/Verification.sol +++ /dev/null @@ -1,223 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.25; - -import {SubstrateMerkleProof} from "./utils/SubstrateMerkleProof.sol"; -import {BeefyClient} from "./BeefyClient.sol"; -import {ScaleCodec} from "./utils/ScaleCodec.sol"; -import {SubstrateTypes} from "./SubstrateTypes.sol"; - -library Verification { - /// @dev Merkle proof for parachain header finalized by BEEFY - /// Reference: https://github.com/paritytech/polkadot/blob/09b61286da11921a3dda0a8e4015ceb9ef9cffca/runtime/rococo/src/lib.rs#L1312 - struct HeadProof { - // The leaf index of the parachain being proven - uint256 pos; - // The number of leaves in the merkle tree - uint256 width; - // The proof items - bytes32[] proof; - } - - /// @dev An MMRLeaf without the `leaf_extra` field. - /// Reference: https://github.com/paritytech/substrate/blob/14e0a0b628f9154c5a2c870062c3aac7df8983ed/primitives/consensus/beefy/src/mmr.rs#L52 - struct MMRLeafPartial { - uint8 version; - uint32 parentNumber; - bytes32 parentHash; - uint64 nextAuthoritySetID; - uint32 nextAuthoritySetLen; - bytes32 nextAuthoritySetRoot; - } - - /// @dev Parachain header - /// References: - /// * https://paritytech.github.io/substrate/master/sp_runtime/generic/struct.Header.html - /// * https://github.com/paritytech/substrate/blob/14e0a0b628f9154c5a2c870062c3aac7df8983ed/primitives/runtime/src/generic/header.rs#L41 - struct ParachainHeader { - bytes32 parentHash; - uint256 number; - bytes32 stateRoot; - bytes32 extrinsicsRoot; - DigestItem[] digestItems; - } - - /// @dev Represents a digest item within a parachain header. - /// References: - /// * https://paritytech.github.io/substrate/master/sp_runtime/generic/enum.DigestItem.html - /// * https://github.com/paritytech/substrate/blob/14e0a0b628f9154c5a2c870062c3aac7df8983ed/primitives/runtime/src/generic/digest.rs#L75 - struct DigestItem { - uint256 kind; - bytes4 consensusEngineID; - bytes data; - } - - /// @dev A chain of proofs - struct Proof { - // The MMR leaf to be proven - MMRLeafPartial leafPartial; - // The MMR leaf prove - bytes32[] leafProof; - // Parachain heads root - bytes32 parachainHeadsRoot; - // The order in which proof items should be combined - uint256 leafProofOrder; - } - - error InvalidParachainHeader(); - - /// @dev IDs of enum variants of DigestItem - /// Reference: https://github.com/paritytech/substrate/blob/14e0a0b628f9154c5a2c870062c3aac7df8983ed/primitives/runtime/src/generic/digest.rs#L201 - uint256 public constant DIGEST_ITEM_OTHER = 0; - uint256 public constant DIGEST_ITEM_CONSENSUS = 4; - uint256 public constant DIGEST_ITEM_SEAL = 5; - uint256 public constant DIGEST_ITEM_PRERUNTIME = 6; - uint256 public constant DIGEST_ITEM_RUNTIME_ENVIRONMENT_UPDATED = 8; - - /// @dev Enum variant ID for CustomDigestItem::Snowbridge - bytes1 public constant DIGEST_ITEM_OTHER_SNOWBRIDGE = 0x00; - - /// @dev Verify the message commitment by applying several proofs - /// - /// 1. First check that the commitment is included in the digest items of the parachain header - /// 2. Generate the root of the parachain heads merkle tree - /// 3. Construct an MMR leaf containing the parachain heads root. - /// 4. Verify that the MMR leaf is included in the MMR maintained by the BEEFY light client. - /// - /// Background info: - /// - /// In the Polkadot relay chain, for every block: - /// 1. A merkle root of finalized parachain headers is constructed: - /// https://github.com/paritytech/polkadot/blob/09b61286da11921a3dda0a8e4015ceb9ef9cffca/runtime/rococo/src/lib.rs#L1312. - /// 2. An MMR leaf is produced, containing this parachain headers root, and is then inserted into the - /// MMR maintained by the `merkle-mountain-range` pallet: - /// https://github.com/paritytech/substrate/tree/master/frame/merkle-mountain-range - /// - /// @param beefyClient The address of the BEEFY light client - /// @param encodedParaID The SCALE-encoded parachain ID of BridgeHub - /// @param messageCommitment The message commitment root expected to be contained within the - /// digest of BridgeHub parachain header. - /// @param proof The chain of proofs described above - function verifyCommitment( - address beefyClient, - bytes4 encodedParaID, - bytes32 messageCommitment, - Proof calldata proof - ) external view returns (bool) { - bytes32 leafHash = createMMRLeaf(proof.leafPartial, proof.parachainHeadsRoot, messageCommitment); - - // Verify that the MMR leaf is part of the MMR maintained by the BEEFY light client - return BeefyClient(beefyClient).verifyMMRLeafProof(leafHash, proof.leafProof, proof.leafProofOrder); - } - - // Verify that a message commitment is in the header digest - function isCommitmentInHeaderDigest(bytes32 messageCommitment, ParachainHeader calldata header) - internal - pure - returns (bool) - { - for (uint256 i = 0; i < header.digestItems.length; i++) { - if ( - header.digestItems[i].kind == DIGEST_ITEM_OTHER && header.digestItems[i].data.length == 33 - && header.digestItems[i].data[0] == DIGEST_ITEM_OTHER_SNOWBRIDGE - && messageCommitment == bytes32(header.digestItems[i].data[1:]) - ) { - return true; - } - } - return false; - } - - // SCALE-Encodes: Vec - // Reference: https://github.com/paritytech/substrate/blob/14e0a0b628f9154c5a2c870062c3aac7df8983ed/primitives/runtime/src/generic/digest.rs#L40 - function encodeDigestItems(DigestItem[] calldata digestItems) internal pure returns (bytes memory) { - // encode all digest items into a buffer - bytes memory accum = hex""; - for (uint256 i = 0; i < digestItems.length; i++) { - accum = bytes.concat(accum, encodeDigestItem(digestItems[i])); - } - // Encode number of digest items, followed by encoded digest items - return bytes.concat(ScaleCodec.checkedEncodeCompactU32(digestItems.length), accum); - } - - function encodeDigestItem(DigestItem calldata digestItem) internal pure returns (bytes memory) { - if ( - digestItem.kind == DIGEST_ITEM_PRERUNTIME || digestItem.kind == DIGEST_ITEM_CONSENSUS - || digestItem.kind == DIGEST_ITEM_SEAL - ) { - return bytes.concat( - bytes1(uint8(digestItem.kind)), - digestItem.consensusEngineID, - ScaleCodec.checkedEncodeCompactU32(digestItem.data.length), - digestItem.data - ); - } else if (digestItem.kind == DIGEST_ITEM_OTHER) { - return bytes.concat( - bytes1(uint8(DIGEST_ITEM_OTHER)), - ScaleCodec.checkedEncodeCompactU32(digestItem.data.length), - digestItem.data - ); - } else if (digestItem.kind == DIGEST_ITEM_RUNTIME_ENVIRONMENT_UPDATED) { - return bytes.concat(bytes1(uint8(DIGEST_ITEM_RUNTIME_ENVIRONMENT_UPDATED))); - } else { - revert InvalidParachainHeader(); - } - } - - // Creates a keccak hash of a SCALE-encoded parachain header - function createParachainHeaderMerkleLeaf(bytes4 encodedParaID, ParachainHeader calldata header) - internal - pure - returns (bytes32) - { - // Hash of encoded parachain header merkle leaf - return keccak256(createParachainHeader(encodedParaID, header)); - } - - function createParachainHeader(bytes4 encodedParaID, ParachainHeader calldata header) - internal - pure - returns (bytes memory) - { - bytes memory encodedHeader = bytes.concat( - // H256 - header.parentHash, - // Compact unsigned int - ScaleCodec.checkedEncodeCompactU32(header.number), - // H256 - header.stateRoot, - // H256 - header.extrinsicsRoot, - // Vec - encodeDigestItems(header.digestItems) - ); - - return bytes.concat( - // u32 - encodedParaID, - // length of encoded header - ScaleCodec.checkedEncodeCompactU32(encodedHeader.length), - encodedHeader - ); - } - - // SCALE-encode: MMRLeaf - // Reference: https://github.com/paritytech/substrate/blob/14e0a0b628f9154c5a2c870062c3aac7df8983ed/primitives/consensus/beefy/src/mmr.rs#L52 - function createMMRLeaf(MMRLeafPartial memory leaf, bytes32 parachainHeadsRoot, bytes32 messageCommitment) - internal - pure - returns (bytes32) - { - bytes memory encodedLeaf = bytes.concat( - ScaleCodec.encodeU8(leaf.version), - ScaleCodec.encodeU32(leaf.parentNumber), - leaf.parentHash, - ScaleCodec.encodeU64(leaf.nextAuthoritySetID), - ScaleCodec.encodeU32(leaf.nextAuthoritySetLen), - leaf.nextAuthoritySetRoot, - parachainHeadsRoot, - messageCommitment - ); - return keccak256(encodedLeaf); - } -} diff --git a/overridden_contracts/src/interfaces/IMiddlewareBasic.sol b/overridden_contracts/src/interfaces/IMiddlewareBasic.sol deleted file mode 100644 index 46f418a..0000000 --- a/overridden_contracts/src/interfaces/IMiddlewareBasic.sol +++ /dev/null @@ -1,53 +0,0 @@ -//SPDX-License-Identifier: GPL-3.0-or-later - -// Copyright (C) Moondance Labs Ltd. -// This file is part of Tanssi. -// Tanssi is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// Tanssi is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with Tanssi. If not, see -pragma solidity ^0.8.0; - -interface IMiddlewareBasic { - /** - * @notice Distribute rewards for a specific era contained in an epoch by providing a Merkle root, total points, total amount of tokens and the token address of the rewards. - * @param epoch network epoch of the middleware - * @param eraIndex era index of Starlight's rewards distribution - * @param totalPointsToken total amount of points for the reward distribution - * @param amount amount of tokens to distribute - * @param root Merkle root of the reward distribution - * @param tokenAddress The token address of the rewards - * @dev This function is called by the gateway only - * @dev Emit DistributeRewards event. - */ - function distributeRewards( - uint256 epoch, - uint256 eraIndex, - uint256 totalPointsToken, - uint256 amount, - bytes32 root, - address tokenAddress - ) external; - - /** - * @notice Slashes an operator's stake - * @dev Only the owner can call this function - * @dev This function first updates the stake cache for the target epoch - * @param epoch The epoch number - * @param operatorKey The operator key to slash - * @param percentage Percentage to slash, represented as parts per billion. - */ - function slash(uint48 epoch, bytes32 operatorKey, uint256 percentage) external; - /** - * @notice Determines which epoch a timestamp belongs to - * @param timestamp The timestamp to check - * @return epoch The corresponding epoch number - */ - function getEpochAtTs(uint48 timestamp) external view returns (uint48 epoch); -} diff --git a/overridden_contracts/src/interfaces/IOGateway.sol b/overridden_contracts/src/interfaces/IOGateway.sol deleted file mode 100644 index 0256258..0000000 --- a/overridden_contracts/src/interfaces/IOGateway.sol +++ /dev/null @@ -1,79 +0,0 @@ -//SPDX-License-Identifier: GPL-3.0-or-later - -// Copyright (C) Moondance Labs Ltd. -// This file is part of Tanssi. -// Tanssi is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// Tanssi is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with Tanssi. If not, see -pragma solidity ^0.8.0; - -import {ParaID, Command} from "../Types.sol"; -import {IGateway} from "./IGateway.sol"; - -interface IOGateway is IGateway { - // Emitted when operators data has been created - event OperatorsDataCreated(uint256 indexed validatorsCount, bytes payload); - - // Emitted when owner of the gateway is changed. - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - // Emitted when the middleware contract address is changed by the owner. - event MiddlewareChanged(address indexed previousMiddleware, address indexed newMiddleware); - - // Emitted when the middleware fails to apply an individual slash - event UnableToProcessIndividualSlashB( - bytes32 indexed operatorKey, uint256 slashFranction, uint256 indexed epoch, bytes error - ); - - // Emitted when the middleware fails to apply an individual slash - event UnableToProcessIndividualSlashS( - bytes32 indexed operatorKey, uint256 slashFranction, uint256 indexed epoch, string error - ); - - // Emitted when the middleware fails to apply the slash message - event UnableToProcessSlashMessageB(bytes error); - - // Emitted when the middleware fails to apply the slash message - event UnableToProcessSlashMessageS(string error); - - // Emitted when the middleware fails to apply the slash message - event UnableToProcessRewardsMessageB(bytes error); - - // Emitted when the middleware fails to apply the slash message - event UnableToProcessRewardsMessageS(string error); - - // Emitted when a non accepted command is received - event NotImplementedCommand(Command command); - - // Slash struct, used to decode slashes, which are identified by - // operatorKey to be slashed - // slashFraction to be applied as parts per billion - // epoch identifying when the slash happened - struct Slash { - bytes32 operatorKey; - uint256 slashFraction; - uint256 epoch; - } - - struct SlashParams { - uint256 eraIndex; - Slash[] slashes; - } - - function s_middleware() external view returns (address); - - function reportSlashes(bytes calldata data) external; - - function sendRewards(bytes calldata data) external; - - function sendOperatorsData(bytes32[] calldata data, uint48 epoch) external; - - function setMiddleware(address middleware) external; -} diff --git a/overridden_contracts/src/libraries/OSubstrateTypes.sol b/overridden_contracts/src/libraries/OSubstrateTypes.sol deleted file mode 100644 index 589d340..0000000 --- a/overridden_contracts/src/libraries/OSubstrateTypes.sol +++ /dev/null @@ -1,43 +0,0 @@ -//SPDX-License-Identifier: GPL-3.0-or-later - -// Copyright (C) Moondance Labs Ltd. -// This file is part of Tanssi. -// Tanssi is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// Tanssi is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with Tanssi. If not, see -pragma solidity 0.8.25; - -import {ScaleCodec} from "../utils/ScaleCodec.sol"; -import {ParaID} from "../Types.sol"; - -library OSubstrateTypes { - enum Message { - V0 - } - - enum OutboundCommandV1 { - ReceiveValidators - } - - function EncodedOperatorsData(bytes memory encodedOperatorsKeys, uint32 operatorsCount, uint48 epoch) - internal - pure - returns (bytes memory) - { - return bytes.concat( - bytes4(0x70150038), - bytes1(uint8(Message.V0)), - bytes1(uint8(OutboundCommandV1.ReceiveValidators)), - ScaleCodec.encodeCompactU32(operatorsCount), - encodedOperatorsKeys, - ScaleCodec.encodeU64(uint64(epoch)) - ); - } -} diff --git a/overridden_contracts/src/storage/GatewayCoreStorage.sol b/overridden_contracts/src/storage/GatewayCoreStorage.sol deleted file mode 100644 index d161c96..0000000 --- a/overridden_contracts/src/storage/GatewayCoreStorage.sol +++ /dev/null @@ -1,33 +0,0 @@ -//SPDX-License-Identifier: GPL-3.0-or-later - -// Copyright (C) Moondance Labs Ltd. -// This file is part of Tanssi. -// Tanssi is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// Tanssi is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with Tanssi. If not, see -pragma solidity 0.8.25; - -library GatewayCoreStorage { - struct Layout { - // Owner of the gateway for configuration purposes. - address owner; - // Address of the Symbiotic middleware to properly execute messages. - address middleware; - } - - bytes32 internal constant SLOT = keccak256("tanssi-bridge-relayer.gateway.core"); - - function layout() internal pure returns (Layout storage ptr) { - bytes32 slot = SLOT; - assembly { - ptr.slot := slot - } - } -} diff --git a/overridden_contracts/src/upgrades/GatewayTanssi202506.sol b/overridden_contracts/src/upgrades/GatewayTanssi202506.sol deleted file mode 100644 index ae99955..0000000 --- a/overridden_contracts/src/upgrades/GatewayTanssi202506.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.25; - -import "../Gateway.sol"; - -// New `Gateway` logic contract for the `GatewayProxy` deployed on mainnet -contract GatewayTanssi202506 is Gateway { - constructor( - address beefyClient, - address agentExecutor, - ParaID bridgeHubParaID, - bytes32 bridgeHubAgentID, - uint8 foreignTokenDecimals, - uint128 destinationMaxTransferFee - ) - Gateway( - beefyClient, - agentExecutor, - bridgeHubParaID, - bridgeHubAgentID, - foreignTokenDecimals, - destinationMaxTransferFee - ) - {} - - // Override parent initializer to prevent re-initialization of storage. - function initialize(bytes memory) external view override { - // Ensure that arbitrary users cannot initialize storage in this logic contract. - if (ERC1967.load() == address(0)) { - revert Unauthorized(); - } - } -} diff --git a/overridden_contracts/src/upgrades/GatewayTanssi202507.sol b/overridden_contracts/src/upgrades/GatewayTanssi202507.sol deleted file mode 100644 index 7e18998..0000000 --- a/overridden_contracts/src/upgrades/GatewayTanssi202507.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.25; - -import "../Gateway.sol"; - -// New `Gateway` logic contract for the `GatewayProxy` deployed on mainnet -contract GatewayTanssi202507 is Gateway { - constructor( - address beefyClient, - address agentExecutor, - ParaID bridgeHubParaID, - bytes32 bridgeHubAgentID, - uint8 foreignTokenDecimals, - uint128 destinationMaxTransferFee - ) - Gateway( - beefyClient, - agentExecutor, - bridgeHubParaID, - bridgeHubAgentID, - foreignTokenDecimals, - destinationMaxTransferFee - ) - {} - - // Override parent initializer to prevent re-initialization of storage. - function initialize(bytes memory) external view override { - // Ensure that arbitrary users cannot initialize storage in this logic contract. - if (ERC1967.load() == address(0)) { - revert Unauthorized(); - } - } -} diff --git a/overridden_contracts/test/BeefyClient.t.sol b/overridden_contracts/test/BeefyClient.t.sol deleted file mode 100644 index 8731e4f..0000000 --- a/overridden_contracts/test/BeefyClient.t.sol +++ /dev/null @@ -1,757 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity 0.8.25; - -import {Strings} from "openzeppelin/utils/Strings.sol"; -import {Test} from "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {stdJson} from "forge-std/StdJson.sol"; - -import {BeefyClient} from "../src/BeefyClient.sol"; -import {BeefyClientMock} from "./mocks/BeefyClientMock.sol"; -import {ScaleCodec} from "../src/utils/ScaleCodec.sol"; -import {Bitfield} from "../src/utils/Bitfield.sol"; - -contract BeefyClientTest is Test { - using stdJson for string; - - BeefyClientMock beefyClient; - uint8 randaoCommitDelay; - uint8 randaoCommitExpiration; - uint256 minNumRequiredSignatures; - uint32 blockNumber; - uint32 prevRandao; - uint32 setSize; - uint32 setId; - uint128 currentSetId; - uint128 nextSetId; - bytes32 commitHash; - bytes32 root; - uint256[] bitSetArray; - uint256[] absentBitSetArray; - uint256[] bitfield; - uint256[] absentBitfield; - bytes32 mmrRoot; - uint256[] finalBitfield; - BeefyClient.ValidatorProof[] finalValidatorProofs; - BeefyClient.ValidatorProof[] finalValidatorProofs3SignatureCount; - bytes32[] mmrLeafProofs; - BeefyClient.MMRLeaf mmrLeaf; - uint256 leafProofOrder; - BeefyClient.MMRLeaf emptyLeaf; - bytes32[] emptyLeafProofs; - uint256 emptyLeafProofOrder; - bytes2 mmrRootID = bytes2("mh"); - string bitFieldFile0SignatureCount; - string bitFieldFile3SignatureCount; - - function setUp() public { - randaoCommitDelay = uint8(vm.envOr("RANDAO_COMMIT_DELAY", uint256(3))); - randaoCommitExpiration = uint8(vm.envOr("RANDAO_COMMIT_EXP", uint256(8))); - minNumRequiredSignatures = uint8(vm.envOr("MINIMUM_REQUIRED_SIGNATURES", uint256(16))); - prevRandao = uint32(vm.envOr("PREV_RANDAO", uint256(377))); - - string memory beefyCommitmentFile = string.concat(vm.projectRoot(), "/test/data/beefy-commitment.json"); - - string memory beefyCommitmentRaw = vm.readFile(beefyCommitmentFile); - - bitFieldFile0SignatureCount = string.concat(vm.projectRoot(), "/test/data/beefy-final-bitfield-0.json"); - bitFieldFile3SignatureCount = string.concat(vm.projectRoot(), "/test/data/beefy-final-bitfield-3.json"); - - blockNumber = uint32(beefyCommitmentRaw.readUint(".params.commitment.blockNumber")); - setId = uint32(beefyCommitmentRaw.readUint(".params.commitment.validatorSetID")); - commitHash = beefyCommitmentRaw.readBytes32(".commitmentHash"); - mmrRoot = beefyCommitmentRaw.readBytes32(".params.commitment.payload[0].data"); - mmrLeafProofs = beefyCommitmentRaw.readBytes32Array(".params.leafProof"); - leafProofOrder = beefyCommitmentRaw.readUint(".params.leafProofOrder"); - decodeMMRLeaf(beefyCommitmentRaw); - - string memory beefyValidatorSetFile = string.concat(vm.projectRoot(), "/test/data/beefy-validator-set.json"); - string memory beefyValidatorSetRaw = vm.readFile(beefyValidatorSetFile); - setSize = uint32(beefyValidatorSetRaw.readUint(".validatorSetSize")); - root = beefyValidatorSetRaw.readBytes32(".validatorRoot"); - bitSetArray = beefyValidatorSetRaw.readUintArray(".participants"); - absentBitSetArray = beefyValidatorSetRaw.readUintArray(".absentees"); - - console.log("current validator's merkle root is: %s", Strings.toHexString(uint256(root), 32)); - - beefyClient = new BeefyClientMock(randaoCommitDelay, randaoCommitExpiration, minNumRequiredSignatures); - - bitfield = beefyClient.createInitialBitfield(bitSetArray, setSize); - absentBitfield = beefyClient.createInitialBitfield(absentBitSetArray, setSize); - - string memory finalProofFile0SignatureCount = - string.concat(vm.projectRoot(), "/test/data/beefy-final-proof-0.json"); - string memory finalProofRaw0SignatureCount = vm.readFile(finalProofFile0SignatureCount); - loadFinalProofs(finalProofRaw0SignatureCount, finalValidatorProofs); - - string memory finalProofFile3SignatureCount = - string.concat(vm.projectRoot(), "/test/data/beefy-final-proof-3.json"); - string memory finalProofRaw3SignatureCount = vm.readFile(finalProofFile3SignatureCount); - loadFinalProofs(finalProofRaw3SignatureCount, finalValidatorProofs3SignatureCount); - } - - function initialize(uint32 _setId) public returns (BeefyClient.Commitment memory) { - currentSetId = _setId; - nextSetId = _setId + 1; - BeefyClient.ValidatorSet memory vset = BeefyClient.ValidatorSet(currentSetId, setSize, root); - BeefyClient.ValidatorSet memory nextvset = BeefyClient.ValidatorSet(nextSetId, setSize, root); - beefyClient.initialize_public(0, vset, nextvset); - BeefyClient.PayloadItem[] memory payload = new BeefyClient.PayloadItem[](1); - payload[0] = BeefyClient.PayloadItem(mmrRootID, abi.encodePacked(mmrRoot)); - return BeefyClient.Commitment(blockNumber, setId, payload); - } - - function printBitArray(uint256[] memory bits) private view { - for (uint256 i = 0; i < bits.length; i++) { - console.log("bits index at %d is %d", i, bits[i]); - } - } - - function loadFinalProofs(string memory finalProofRaw, BeefyClient.ValidatorProof[] storage finalProofs) internal { - bytes memory proofRaw = finalProofRaw.readBytes(".finalValidatorsProofRaw"); - BeefyClient.ValidatorProof[] memory proofs = abi.decode(proofRaw, (BeefyClient.ValidatorProof[])); - for (uint256 i = 0; i < proofs.length; i++) { - finalProofs.push(proofs[i]); - } - } - - // Ideally should also update `finalValidatorProofs` with another round of ffi based on the `finalBitfield` here - // For simplicity we just use the proof previously cached - // still update `finalBitfield` here is to simulate more close to the real workflow and make gas estimation more accurate - function createFinalProofs() internal { - finalBitfield = beefyClient.createFinalBitfield(commitHash, bitfield); - } - - function commitPrevRandao() internal { - vm.prevrandao(bytes32(uint256(prevRandao))); - beefyClient.commitPrevRandao(commitHash); - } - - // Regenerate bitField file - function regenerateBitField(string memory bitfieldFile, uint256 numRequiredSignatures) internal { - console.log("print initialBitField"); - printBitArray(bitfield); - prevRandao = uint32(vm.envOr("PREV_RANDAO", prevRandao)); - finalBitfield = Bitfield.subsample(prevRandao, bitfield, numRequiredSignatures, setSize); - console.log("print finalBitField"); - printBitArray(finalBitfield); - - string memory finalBitFieldRaw = ""; - finalBitFieldRaw = finalBitFieldRaw.serialize("finalBitFieldRaw", abi.encode(finalBitfield)); - - string memory finaliBitFieldStr = ""; - finaliBitFieldStr = finaliBitFieldStr.serialize("finalBitField", finalBitfield); - - string memory output = finalBitFieldRaw.serialize("final", finaliBitFieldStr); - - vm.writeJson(output, bitfieldFile); - } - - function decodeMMRLeaf(string memory beefyCommitmentRaw) internal { - uint8 version = uint8(beefyCommitmentRaw.readUint(".params.leaf.version")); - uint32 parentNumber = uint32(beefyCommitmentRaw.readUint(".params.leaf.parentNumber")); - bytes32 parentHash = beefyCommitmentRaw.readBytes32(".params.leaf.parentHash"); - uint64 nextAuthoritySetID = uint64(beefyCommitmentRaw.readUint(".params.leaf.nextAuthoritySetID")); - uint32 nextAuthoritySetLen = uint32(beefyCommitmentRaw.readUint(".params.leaf.nextAuthoritySetLen")); - bytes32 nextAuthoritySetRoot = beefyCommitmentRaw.readBytes32(".params.leaf.nextAuthoritySetRoot"); - bytes32 parachainHeadsRoot = beefyCommitmentRaw.readBytes32(".params.leaf.parachainHeadsRoot"); - bytes32 messageCommitment = beefyCommitmentRaw.readBytes32(".params.leaf.messageCommitment"); - mmrLeaf = BeefyClient.MMRLeaf( - version, - parentNumber, - parentHash, - nextAuthoritySetID, - nextAuthoritySetLen, - nextAuthoritySetRoot, - parachainHeadsRoot, - messageCommitment - ); - } - - function testSubmit() public returns (BeefyClient.Commitment memory) { - BeefyClient.Commitment memory commitment = initialize(setId); - - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 0); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 1); - - // mine random delay blocks - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - beefyClient.submitFinal( - commitment, bitfield, finalValidatorProofs, emptyLeaf, emptyLeafProofs, emptyLeafProofOrder - ); - - assertEq(beefyClient.latestBeefyBlock(), blockNumber); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 1); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 0); - return commitment; - } - - function testSubmitWithOldBlockFailsWithStaleCommitment() public { - BeefyClient.Commitment memory commitment = initialize(setId); - beefyClient.setLatestBeefyBlock(commitment.blockNumber + 1); - vm.expectRevert(BeefyClient.StaleCommitment.selector); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - } - - function testSubmitWithHandoverAndOldBlockFailsWithStaleCommitment() public { - BeefyClient.Commitment memory commitment = initialize(setId - 1); - beefyClient.setLatestBeefyBlock(commitment.blockNumber + 1); - vm.expectRevert(BeefyClient.StaleCommitment.selector); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - } - - function testSubmitWith3SignatureCount() public returns (BeefyClient.Commitment memory) { - BeefyClient.Commitment memory commitment = initialize(setId); - - // Signature count is 0 for the first submitInitial. - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 0); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // Signature count is now 1 after a second submitInitial. - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 1); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // Signature count is still 1 because we use another validator. - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[1].index), 0); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[1]); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[1].index), 1); - - // Signature count is now 2 after a third submitInitial. - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 2); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // Signature count is now 3 after a forth submitInitial. - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 3); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // mine random delay blocks - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - beefyClient.submitFinal( - commitment, bitfield, finalValidatorProofs3SignatureCount, emptyLeaf, emptyLeafProofs, emptyLeafProofOrder - ); - - assertEq(beefyClient.latestBeefyBlock(), blockNumber); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 4); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 0); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[1].index), 1); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[1].index), 0); - return commitment; - } - - function testSubmitFailWithInvalidValidatorProofWhenNotProvidingSignatureCount() public { - BeefyClient.Commitment memory commitment = initialize(setId); - - // Signature count is 0 for the first submitInitial. - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // Signature count is now 1 after a second submitInitial. - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // Signature count is now 2 after a third submitInitial. - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // mine random delay blocks - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - // make an invalid signature - vm.expectRevert(BeefyClient.InvalidValidatorProofLength.selector); - beefyClient.submitFinal(commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder); - } - - function testSubmitFailInvalidSignature() public { - BeefyClient.Commitment memory commitment = initialize(setId); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // mine random delay blocks - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - // make an invalid signature - finalValidatorProofs[0].r = 0xb5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c; - vm.expectRevert(BeefyClient.InvalidSignature.selector); - beefyClient.submitFinal( - commitment, bitfield, finalValidatorProofs, emptyLeaf, emptyLeafProofs, emptyLeafProofOrder - ); - } - - function testSubmitFailValidatorNotInBitfield() public { - BeefyClient.Commitment memory commitment = initialize(setId); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // mine random delay blocks - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - // make an invalid validator index - finalValidatorProofs[0].index = 0; - vm.expectRevert(BeefyClient.InvalidValidatorProof.selector); - beefyClient.submitFinal( - commitment, bitfield, finalValidatorProofs, emptyLeaf, emptyLeafProofs, emptyLeafProofOrder - ); - } - - function testSubmitFailWithStaleCommitment() public { - BeefyClient.Commitment memory commitment = initialize(setId); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // mine random delay blocks - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - // Simulates another submitFinal incrementing the latestBeefyBlock - beefyClient.setLatestBeefyBlock(commitment.blockNumber + 1); - - vm.expectRevert(BeefyClient.StaleCommitment.selector); - beefyClient.submitFinal( - commitment, bitfield, finalValidatorProofs, emptyLeaf, emptyLeafProofs, emptyLeafProofOrder - ); - } - - function testSubmitFailWithInvalidBitfield() public { - BeefyClient.Commitment memory commitment = initialize(setId); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - // invalid bitfield here - bitfield[0] = 0; - vm.expectRevert(BeefyClient.InvalidBitfield.selector); - beefyClient.submitFinal( - commitment, bitfield, finalValidatorProofs, emptyLeaf, emptyLeafProofs, emptyLeafProofOrder - ); - } - - function testSubmitFailWithoutPrevRandao() public { - BeefyClient.Commitment memory commitment = initialize(setId); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // reverted without commit PrevRandao - vm.expectRevert(BeefyClient.PrevRandaoNotCaptured.selector); - beefyClient.submitFinal( - commitment, bitfield, finalValidatorProofs, emptyLeaf, emptyLeafProofs, emptyLeafProofOrder - ); - } - - function testSubmitFailForPrevRandaoTooEarlyOrTooLate() public { - BeefyClient.Commitment memory commitment = initialize(setId); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - // reverted for commit PrevRandao too early - vm.expectRevert(BeefyClient.WaitPeriodNotOver.selector); - commitPrevRandao(); - - // reverted for commit PrevRandao too late - vm.roll(block.number + randaoCommitDelay + randaoCommitExpiration + 1); - vm.expectRevert(BeefyClient.TicketExpired.selector); - commitPrevRandao(); - } - - function testSubmitFailForPrevRandaoCapturedMoreThanOnce() public { - BeefyClient.Commitment memory commitment = initialize(setId); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - vm.roll(block.number + randaoCommitDelay); - commitPrevRandao(); - - vm.expectRevert(BeefyClient.PrevRandaoAlreadyCaptured.selector); - commitPrevRandao(); - } - - function testSubmitWithHandover() public { - //initialize with previous set - BeefyClient.Commitment memory commitment = initialize(setId - 1); - - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 0); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 0); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 0); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 1); - - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - beefyClient.submitFinal(commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder); - assertEq(beefyClient.latestBeefyBlock(), blockNumber); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 1); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 0); - } - - function testSubmitWithHandoverCountersAreCopiedCorrectly() public { - //initialize with previous set - BeefyClient.Commitment memory commitment = initialize(setId - 1); - - // submit with the first validator - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[1]); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[1].index), 0); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[1].index), 1); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 0); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 1); - - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - beefyClient.submitFinal(commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder); - assertEq(beefyClient.latestBeefyBlock(), blockNumber); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 1); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 0); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[1].index), 1); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[1].index), 0); - } - - function testCommitPrevRandaoCalledInSequence() public { - vm.expectRevert(BeefyClient.InvalidTicket.selector); - commitPrevRandao(); - } - - function testSubmitWithHandoverAnd3SignatureCount() public { - //initialize with previous set - BeefyClient.Commitment memory commitment = initialize(setId - 1); - - // Signature count is 0 for the first submitInitial. - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 0); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // Signature count is now 1 after a second submitInitial. - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 1); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // Signature count is still 1 because we use another validator. - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[1].index), 0); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[1]); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[1].index), 1); - - // Signature count is now 2 after a third submitInitial. - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 2); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // Signature count is now 3 after a forth submitInitial. - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 3); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - beefyClient.submitFinal( - commitment, bitfield, finalValidatorProofs3SignatureCount, mmrLeaf, mmrLeafProofs, leafProofOrder - ); - assertEq(beefyClient.latestBeefyBlock(), blockNumber); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[0].index), 4); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[0].index), 0); - assertEq(beefyClient.getValidatorCounter(false, finalValidatorProofs[1].index), 1); - assertEq(beefyClient.getValidatorCounter(true, finalValidatorProofs[1].index), 0); - } - - function testSubmitWithHandoverFailWithInvalidValidatorProofWhenNotProvidingSignatureCount() public { - //initialize with previous set - BeefyClient.Commitment memory commitment = initialize(setId - 1); - - // Signature count is 0 for the first submitInitial. - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // Signature count is now 1 after a second submitInitial. - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // Signature count is now 2 after a third submitInitial. - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - vm.expectRevert(BeefyClient.InvalidValidatorProofLength.selector); - beefyClient.submitFinal(commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder); - } - - function testSubmitWithHandoverFailWithoutPrevRandao() public { - //initialize with previous set - BeefyClient.Commitment memory commitment = initialize(setId - 1); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - vm.expectRevert(BeefyClient.PrevRandaoNotCaptured.selector); - beefyClient.submitFinal(commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder); - } - - function testSubmitWithHandoverFailStaleCommitment() public { - BeefyClient.Commitment memory commitment = initialize(setId - 1); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - // mine random delay blocks - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - // Simulates another submitFinal incrementing the latestBeefyBlock - beefyClient.setLatestBeefyBlock(commitment.blockNumber + 1); - - vm.expectRevert(BeefyClient.StaleCommitment.selector); - beefyClient.submitFinal( - commitment, bitfield, finalValidatorProofs, emptyLeaf, emptyLeafProofs, emptyLeafProofOrder - ); - } - - function testScaleEncodeCommit() public { - BeefyClient.PayloadItem[] memory _payload = new BeefyClient.PayloadItem[](2); - _payload[0] = BeefyClient.PayloadItem(bytes2("ab"), hex"000102"); - _payload[1] = - BeefyClient.PayloadItem(mmrRootID, hex"3ac49cd24778522203e8bf40a4712ea3f07c3803bbd638cb53ebb3564ec13e8c"); - - BeefyClient.Commitment memory _commitment = BeefyClient.Commitment(5, 7, _payload); - - bytes memory encoded = beefyClient.encodeCommitment_public(_commitment); - - assertEq( - encoded, - hex"0861620c0001026d68803ac49cd24778522203e8bf40a4712ea3f07c3803bbd638cb53ebb3564ec13e8c050000000700000000000000" - ); - } - - function testCreateInitialBitfield() public { - initialize(setId); - uint256[] memory initialBitfield = beefyClient.createInitialBitfield(bitSetArray, setSize); - assertTrue(initialBitfield.length == (setSize + 255) / 256); - printBitArray(initialBitfield); - } - - function testCreateInitialBitfieldInvalid() public { - initialize(setId); - vm.expectRevert(BeefyClient.InvalidBitfieldLength.selector); - beefyClient.createInitialBitfield(bitSetArray, bitSetArray.length - 1); - } - - function testCreateFinalBitfield() public { - BeefyClient.Commitment memory commitment = initialize(setId); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - vm.roll(block.number + randaoCommitDelay); - commitPrevRandao(); - - uint256[] memory finalBits = beefyClient.createFinalBitfield(commitHash, bitfield); - assertTrue(Bitfield.countSetBits(finalBits) < Bitfield.countSetBits(bitfield)); - } - - function testCreateFinalBitfieldInvalid() public { - BeefyClient.Commitment memory commitment = initialize(setId); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - vm.roll(block.number + randaoCommitDelay); - commitPrevRandao(); - - // make invalid bitfield not same as initialized - bitfield[0] = 0; - vm.expectRevert(BeefyClient.InvalidBitfield.selector); - beefyClient.createFinalBitfield(commitHash, bitfield); - } - - function testSubmitFailWithInvalidValidatorSet() public { - BeefyClient.Commitment memory commitment = initialize(setId); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - vm.roll(block.number + randaoCommitDelay); - commitPrevRandao(); - - createFinalProofs(); - - //reinitialize with next validator set - initialize(setId + 1); - //submit will be reverted with InvalidCommitment - vm.expectRevert(BeefyClient.InvalidCommitment.selector); - beefyClient.submitFinal(commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder); - } - - function testSubmitWithHandoverFailWithInvalidValidatorSet() public { - //initialize with previous set - BeefyClient.Commitment memory commitment = initialize(setId - 1); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - vm.roll(block.number + randaoCommitDelay); - commitPrevRandao(); - - createFinalProofs(); - - //reinitialize with next validator set - initialize(setId + 1); - //submit will be reverted with InvalidCommitment - vm.expectRevert(BeefyClient.InvalidCommitment.selector); - beefyClient.submitFinal(commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder); - } - - function testSubmitFailWithInvalidTicket() public { - BeefyClient.Commitment memory commitment = initialize(setId); - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - vm.roll(block.number + randaoCommitDelay); - commitPrevRandao(); - - createFinalProofs(); - - // Changing the commitment changes its hash, so the ticket can't be found. - // A zero value ticket is returned in this case, because submitInitial hasn't run for this commitment. - BeefyClient.Commitment memory _commitment = BeefyClient.Commitment(blockNumber, setId + 1, commitment.payload); - //submit will be reverted with InvalidTicket - vm.expectRevert(BeefyClient.InvalidTicket.selector); - beefyClient.submitFinal(_commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder); - } - - function testSubmitFailWithInvalidMMRLeaf() public { - //initialize with previous set - BeefyClient.Commitment memory commitment = initialize(setId - 1); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - vm.roll(block.number + randaoCommitDelay); - - vm.prevrandao(bytes32(uint256(prevRandao))); - - beefyClient.commitPrevRandao(commitHash); - - createFinalProofs(); - - //construct nextAuthoritySetID with a wrong value - mmrLeaf.nextAuthoritySetID = setId; - //submit will be reverted with InvalidMMRLeaf - vm.expectRevert(BeefyClient.InvalidMMRLeaf.selector); - beefyClient.submitFinal(commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder); - } - - function testSubmitFailWithInvalidMMRLeafProof() public { - //initialize with previous set - BeefyClient.Commitment memory commitment = initialize(setId - 1); - - beefyClient.submitInitial(commitment, bitfield, finalValidatorProofs[0]); - - vm.roll(block.number + randaoCommitDelay); - - commitPrevRandao(); - - createFinalProofs(); - - //construct parentNumber with a wrong value - mmrLeaf.parentNumber = 1; - //submit will be reverted with InvalidMMRLeafProof - vm.expectRevert(BeefyClient.InvalidMMRLeafProof.selector); - beefyClient.submitFinal(commitment, bitfield, finalValidatorProofs, mmrLeaf, mmrLeafProofs, leafProofOrder); - } - - function testSubmitFailWithNotEnoughClaims() public { - BeefyClient.Commitment memory commitment = initialize(setId); - uint256[] memory initialBits = absentBitfield; - Bitfield.set(initialBits, finalValidatorProofs[0].index); - printBitArray(initialBits); - vm.expectRevert(BeefyClient.NotEnoughClaims.selector); - beefyClient.submitInitial(commitment, initialBits, finalValidatorProofs[0]); - } - - function testRegenerateBitField() public { - // Generate a bitfield for signature count 0. - uint256 numRequiredSignatures = - beefyClient.computeNumRequiredSignatures_public(setSize, 0, minNumRequiredSignatures); - regenerateBitField(bitFieldFile0SignatureCount, numRequiredSignatures); - // Generate a bitfield for signature count 3. - numRequiredSignatures = beefyClient.computeNumRequiredSignatures_public(setSize, 3, minNumRequiredSignatures); - regenerateBitField(bitFieldFile3SignatureCount, numRequiredSignatures); - } - - function testFuzzComputeValidatorSetQuorum(uint128 validatorSetLen) public { - // There must be atleast 1 validator. - vm.assume(validatorSetLen > 0); - // Calculator 2/3 with flooring due to integer division. - uint256 twoThirdsMajority = uint256(validatorSetLen) * 2 / 3; - uint256 result = beefyClient.computeQuorum_public(validatorSetLen); - assertGt(result, twoThirdsMajority, "result is greater than 2/3rds"); - assertLe(result, validatorSetLen, "result is less than validator set length."); - assertGt(result, 0, "result is greater than zero."); - } - - function testFuzzSignatureSamplingRanges(uint128 validatorSetLen, uint16 signatureUsageCount, uint16 minSignatures) - public - { - // There must be atleast 1 validator. - vm.assume(validatorSetLen > 0); - // Min signatures must be less than the amount of validators. - vm.assume(beefyClient.computeQuorum_public(validatorSetLen) > minSignatures); - - uint256 result = - beefyClient.computeNumRequiredSignatures_public(validatorSetLen, signatureUsageCount, minSignatures); - - // Calculator 2/3 with flooring due to integer division plus 1. - uint256 twoThirdsMajority = uint256(validatorSetLen) * 2 / 3 + 1; - assertLe(result, twoThirdsMajority, "result is less than or equal to quorum."); - assertGe(result, minSignatures, "result is greater than or equal to minimum signatures."); - assertLe(result, validatorSetLen, "result is less than validator set length."); - assertGt(result, 0, "result is greater than zero."); - } - - function testSignatureSamplingCases() public { - uint256 result = beefyClient.computeQuorum_public(1); - assertEq(1, result, "B"); - result = beefyClient.computeNumRequiredSignatures_public(1, 0, 0); - assertEq(1, result, "C"); - } - - function testStorageToStorageCopies() public { - beefyClient.copyCounters(); - } - - function testFuzzInitializationValidation(uint128 currentId, uint128 nextId) public { - vm.assume(currentId < type(uint128).max); - vm.assume(currentId + 1 != nextId); - vm.expectRevert("invalid-constructor-params"); - new BeefyClient( - randaoCommitDelay, - randaoCommitExpiration, - minNumRequiredSignatures, - 0, - BeefyClient.ValidatorSet(currentId, 0, 0x0), - BeefyClient.ValidatorSet(nextId, 0, 0x0) - ); - } -} diff --git a/overridden_contracts/test/Bitfield.t.sol b/overridden_contracts/test/Bitfield.t.sol deleted file mode 100644 index 90fbc83..0000000 --- a/overridden_contracts/test/Bitfield.t.sol +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity 0.8.25; - -import {Test} from "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; -import {BitfieldWrapper} from "./mocks/BitfieldWrapper.sol"; -import {Bitfield} from "../src/utils/Bitfield.sol"; - -import {stdJson} from "forge-std/StdJson.sol"; - -contract BitfieldTest is Test { - using stdJson for string; - - function testBitfieldSubsampling() public { - BitfieldWrapper bw = new BitfieldWrapper(); - - string memory json = vm.readFile(string.concat(vm.projectRoot(), "/test/data/beefy-validator-set.json")); - uint32 setSize = uint32(json.readUint(".validatorSetSize")); - bytes32 root = json.readBytes32(".validatorRoot"); - uint256[] memory bitSetArray = json.readUintArray(".participants"); - - uint256[] memory initialBitField = bw.createBitfield(bitSetArray, setSize); - uint256[] memory finalBitfield = bw.subsample(67, initialBitField, 10, setSize); - - uint256 counter = 0; - for (uint256 i = 0; i < bitSetArray.length; i++) { - if (Bitfield.isSet(finalBitfield, bitSetArray[i])) { - counter++; - } - } - assertEq(10, counter); - assertEq(Bitfield.countSetBits(finalBitfield), counter); - } -} diff --git a/overridden_contracts/test/ForkUpgrade.t.sol b/overridden_contracts/test/ForkUpgrade.t.sol deleted file mode 100644 index fc1f1b5..0000000 --- a/overridden_contracts/test/ForkUpgrade.t.sol +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity 0.8.25; - -import {Test} from "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; - -import {IUpgradable} from "../src/interfaces/IUpgradable.sol"; -import {IGateway} from "../src/interfaces/IGateway.sol"; -import {Gateway} from "../src/Gateway.sol"; -import {Gateway202410} from "../src/upgrades/Gateway202410.sol"; -import {AgentExecutor} from "../src/AgentExecutor.sol"; -import {UpgradeParams, SetOperatingModeParams, OperatingMode, RegisterForeignTokenParams} from "../src/Params.sol"; -import {ChannelID, ParaID, OperatingMode, TokenInfo} from "../src/Types.sol"; - -contract ForkUpgradeTest is Test { - address private constant GatewayProxy = 0x27ca963C279c93801941e1eB8799c23f407d68e7; - address private constant BeefyClient = 0x6eD05bAa904df3DE117EcFa638d4CB84e1B8A00C; - bytes32 private constant BridgeHubAgent = 0x03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314; - - function setUp() public { - vm.createSelectFork("https://ethereum-rpc.publicnode.com", 20645700); - vm.allowCheatcodes(GatewayProxy); - vm.startPrank(GatewayProxy); - forkUpgrade(); - } - - function forkUpgrade() public { - AgentExecutor executor = new AgentExecutor(); - - Gateway202410 newLogic = - new Gateway202410(BeefyClient, address(executor), ParaID.wrap(1002), BridgeHubAgent, 10, 20000000000); - - UpgradeParams memory params = - UpgradeParams({impl: address(newLogic), implCodeHash: address(newLogic).codehash, initParams: bytes("")}); - - vm.expectEmit(true, false, false, false); - emit IUpgradable.Upgraded(address(newLogic)); - - Gateway(GatewayProxy).upgrade(abi.encode(params)); - } - - function checkLegacyToken() public { - assert(IGateway(GatewayProxy).isTokenRegistered(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)); - assertEq(IGateway(GatewayProxy).queryForeignTokenID(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2), bytes32("")); - assert(IGateway(GatewayProxy).isTokenRegistered(0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003)); - assertEq(IGateway(GatewayProxy).queryForeignTokenID(0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003), bytes32("")); - } - - function registerForeignToken() public { - bytes32 dotId = 0xa8f2ec5bdd7a07d844ee3bce83f9ba3881f495d96f07cacbeeb77d9e031db4f0; - RegisterForeignTokenParams memory params = - RegisterForeignTokenParams({foreignTokenID: dotId, name: "DOT", symbol: "DOT", decimals: 10}); - - vm.expectEmit(true, true, false, false); - emit IGateway.ForeignTokenRegistered(dotId, address(0x0)); - - Gateway202410(GatewayProxy).registerForeignToken(abi.encode(params)); - assert(IGateway(GatewayProxy).isTokenRegistered(0x70D9d338A6b17957B16836a90192BD8CDAe0b53d)); - assertEq(IGateway(GatewayProxy).queryForeignTokenID(0x70D9d338A6b17957B16836a90192BD8CDAe0b53d), dotId); - } - - function testSanityCheck() public { - // Check AH channel nonces as expected - (uint64 inbound, uint64 outbound) = IGateway(GatewayProxy).channelNoncesOf( - ChannelID.wrap(0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539) - ); - assertEq(inbound, 13); - assertEq(outbound, 172); - // Register PNA - registerForeignToken(); - // Check legacy ethereum token not affected - checkLegacyToken(); - } -} diff --git a/overridden_contracts/test/ForkUpgrade202502.t.sol b/overridden_contracts/test/ForkUpgrade202502.t.sol deleted file mode 100644 index 892aa24..0000000 --- a/overridden_contracts/test/ForkUpgrade202502.t.sol +++ /dev/null @@ -1,110 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity 0.8.25; - -import {Test} from "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; - -import {IUpgradable} from "../src/interfaces/IUpgradable.sol"; -import {IGateway} from "../src/interfaces/IGateway.sol"; -import {Gateway} from "../src/Gateway.sol"; -import {Gateway202502} from "../src/upgrades/Gateway202502.sol"; -import {AgentExecutor} from "../src/AgentExecutor.sol"; -import {UpgradeParams, SetOperatingModeParams, OperatingMode, RegisterForeignTokenParams} from "../src/Params.sol"; -import {ChannelID, ParaID, OperatingMode, TokenInfo} from "../src/Types.sol"; -import {MultiAddress, multiAddressFromBytes32} from "../src/MultiAddress.sol"; - -contract ForkUpgradeTest is Test { - address private constant GatewayProxy = 0x27ca963C279c93801941e1eB8799c23f407d68e7; - address private constant BeefyClient = 0x6eD05bAa904df3DE117EcFa638d4CB84e1B8A00C; - bytes32 private constant BridgeHubAgent = 0x03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314; - bytes32 private constant AssetHubAgent = 0x81c5ab2571199e3188135178f3c2c8e2d268be1313d029b30f534fa579b69b79; - - function setUp() public { - vm.createSelectFork("https://ethereum-rpc.publicnode.com", 20645700); - vm.allowCheatcodes(GatewayProxy); - vm.startPrank(GatewayProxy); - forkUpgrade(); - } - - function forkUpgrade() public { - AgentExecutor executor = new AgentExecutor(); - - Gateway202502 newLogic = - new Gateway202502(BeefyClient, address(executor), ParaID.wrap(1002), BridgeHubAgent, 10, 20000000000); - - UpgradeParams memory params = - UpgradeParams({impl: address(newLogic), implCodeHash: address(newLogic).codehash, initParams: bytes("")}); - - Gateway gateway = Gateway(GatewayProxy); - - vm.expectEmit(); - emit IUpgradable.Upgraded(address(newLogic)); - - gateway.upgrade(abi.encode(params)); - } - - function testSanityCheck() public { - // Check AH channel nonces as expected - (uint64 inbound, uint64 outbound) = IGateway(GatewayProxy).channelNoncesOf( - ChannelID.wrap(0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539) - ); - assertEq(inbound, 13); - assertEq(outbound, 172); - // Register PNA - registerForeignToken(); - // Check legacy ethereum token not affected - checkLegacyToken(); - // Check sending of ether works - checkSendingEthWithAmountAndFeeSucceeds(); - } - - function checkLegacyToken() public { - assert(IGateway(GatewayProxy).isTokenRegistered(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)); - assertEq(IGateway(GatewayProxy).queryForeignTokenID(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2), bytes32("")); - assert(IGateway(GatewayProxy).isTokenRegistered(0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003)); - assertEq(IGateway(GatewayProxy).queryForeignTokenID(0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003), bytes32("")); - } - - function registerForeignToken() public { - bytes32 dotId = 0xa8f2ec5bdd7a07d844ee3bce83f9ba3881f495d96f07cacbeeb77d9e031db4f0; - RegisterForeignTokenParams memory params = - RegisterForeignTokenParams({foreignTokenID: dotId, name: "DOT", symbol: "DOT", decimals: 10}); - - vm.expectEmit(true, true, false, false); - emit IGateway.ForeignTokenRegistered(dotId, address(0x0)); - - Gateway202502(GatewayProxy).registerForeignToken(abi.encode(params)); - assert(IGateway(GatewayProxy).isTokenRegistered(0x70D9d338A6b17957B16836a90192BD8CDAe0b53d)); - assertEq(IGateway(GatewayProxy).queryForeignTokenID(0x70D9d338A6b17957B16836a90192BD8CDAe0b53d), dotId); - } - - function checkSendingEthWithAmountAndFeeSucceeds() public { - // Create a mock user - address user = makeAddr("user"); - uint128 amount = 1; - ParaID paraID = ParaID.wrap(1000); - MultiAddress memory recipientAddress32 = multiAddressFromBytes32(keccak256("recipient")); - - uint128 fee = uint128(IGateway(GatewayProxy).quoteSendTokenFee(address(0), paraID, 1)); - - vm.expectEmit(); - emit IGateway.TokenSent(address(0), user, paraID, recipientAddress32, amount); - - uint64 nonce = 173; - bytes32 messageID = keccak256(abi.encodePacked(paraID.into(), nonce)); - - vm.expectEmit(); - emit IGateway.OutboundMessageAccepted( - paraID.into(), - nonce, - messageID, - hex"00010000000000000001000000000000000000000000000000000000000000811085f5b5d1b29598e73ca51de3d712f5d3103ad50e22dc1f4d3ff1559d51150100000000000000000000000000000000ca9a3b000000000000000000000000" - ); - - deal(user, amount + fee); - vm.startPrank(user); - IGateway(GatewayProxy).sendToken{value: amount + fee}(address(0), paraID, recipientAddress32, 1, amount); - - assertEq(user.balance, 0); - } -} diff --git a/overridden_contracts/test/Gateway.t.sol b/overridden_contracts/test/Gateway.t.sol deleted file mode 100644 index 91ad2a5..0000000 --- a/overridden_contracts/test/Gateway.t.sol +++ /dev/null @@ -1,1103 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity 0.8.25; - -import {Test} from "forge-std/Test.sol"; -import {Strings} from "openzeppelin/utils/Strings.sol"; -import {console} from "forge-std/console.sol"; - -import {BeefyClient} from "../src/BeefyClient.sol"; - -import {IGateway} from "../src/interfaces/IGateway.sol"; -import {IOGateway} from "../src/interfaces/IOGateway.sol"; -import {IInitializable} from "../src/interfaces/IInitializable.sol"; -import {IUpgradable} from "../src/interfaces/IUpgradable.sol"; -import {Gateway} from "../src/Gateway.sol"; -import {MockGateway} from "./mocks/MockGateway.sol"; - -import {MockGatewayV2} from "./mocks/MockGatewayV2.sol"; -import {GatewayProxy} from "../src/GatewayProxy.sol"; - -import {AgentExecutor} from "../src/AgentExecutor.sol"; -import {Agent} from "../src/Agent.sol"; -import {Verification} from "../src/Verification.sol"; -import {Assets} from "../src/Assets.sol"; -import {SubstrateTypes} from "./../src/SubstrateTypes.sol"; -import {MultiAddress} from "../src/MultiAddress.sol"; -import {Channel, InboundMessage, OperatingMode, ParaID, Command, ChannelID, MultiAddress} from "../src/Types.sol"; - -import {NativeTransferFailed, SafeNativeTransfer} from "../src/utils/SafeTransfer.sol"; -import {PricingStorage} from "../src/storage/PricingStorage.sol"; -import {IERC20} from "../src/interfaces/IERC20.sol"; -import {TokenLib} from "../src/TokenLib.sol"; -import {Token} from "../src/Token.sol"; - -import { - UpgradeParams, - CreateAgentParams, - AgentExecuteParams, - CreateChannelParams, - UpdateChannelParams, - SetOperatingModeParams, - TransferNativeFromAgentParams, - SetTokenTransferFeesParams, - SetPricingParametersParams, - RegisterForeignTokenParams, - TransferNativeTokenParams, - MintForeignTokenParams -} from "../src/Params.sol"; - -import { - AgentExecuteCommand, - InboundMessage, - OperatingMode, - ParaID, - Command, - multiAddressFromBytes32, - multiAddressFromBytes20 -} from "../src/Types.sol"; - -import {WETH9} from "canonical-weth/WETH9.sol"; -import {UD60x18, ud60x18, convert} from "prb/math/src/UD60x18.sol"; - -contract GatewayTest is Test { - // Emitted when token minted/burnt/transfered - event Transfer(address indexed from, address indexed to, uint256 value); - - ParaID public bridgeHubParaID = ParaID.wrap(1013); - bytes32 public bridgeHubAgentID = 0x03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314; - address public bridgeHubAgent; - - ParaID public assetHubParaID = ParaID.wrap(1000); - bytes32 public assetHubAgentID = 0x81c5ab2571199e3188135178f3c2c8e2d268be1313d029b30f534fa579b69b79; - address public assetHubAgent; - - address public relayer; - - bytes32[] public proof = [bytes32(0x2f9ee6cfdf244060dc28aa46347c5219e303fc95062dd672b4e406ca5c29764b)]; - bytes public parachainHeaderProof = bytes("validProof"); - - MockGateway public gatewayLogic; - GatewayProxy public gateway; - - WETH9 public token; - - address public account1; - address public account2; - - uint64 public maxDispatchGas = 500_000; - uint256 public maxRefund = 1 ether; - uint256 public reward = 1 ether; - bytes32 public messageID = keccak256("cabbage"); - - // remote fees in DOT - uint128 public outboundFee = 1e10; - uint128 public registerTokenFee = 0; - uint128 public sendTokenFee = 1e10; - uint128 public createTokenFee = 1e10; - uint128 public maxDestinationFee = 1e11; - - MultiAddress public recipientAddress32; - MultiAddress public recipientAddress20; - - // For DOT - uint8 public foreignTokenDecimals = 10; - - // ETH/DOT exchange rate - UD60x18 public exchangeRate = ud60x18(0.0025e18); - UD60x18 public multiplier = ud60x18(1e18); - - // tokenID for DOT - bytes32 public dotTokenID; - - function setUp() public { - AgentExecutor executor = new AgentExecutor(); - gatewayLogic = new MockGateway( - address(0), address(executor), bridgeHubParaID, bridgeHubAgentID, foreignTokenDecimals, maxDestinationFee - ); - Gateway.Config memory config = Gateway.Config({ - mode: OperatingMode.Normal, - deliveryCost: outboundFee, - registerTokenFee: registerTokenFee, - assetHubParaID: assetHubParaID, - assetHubAgentID: assetHubAgentID, - assetHubCreateAssetFee: createTokenFee, - assetHubReserveTransferFee: sendTokenFee, - exchangeRate: exchangeRate, - multiplier: multiplier, - rescueOperator: 0x4B8a782D4F03ffcB7CE1e95C5cfe5BFCb2C8e967 - }); - gateway = new GatewayProxy(address(gatewayLogic), abi.encode(config)); - MockGateway(address(gateway)).setCommitmentsAreVerified(true); - - SetOperatingModeParams memory params = SetOperatingModeParams({mode: OperatingMode.Normal}); - MockGateway(address(gateway)).setOperatingModePublic(abi.encode(params)); - - bridgeHubAgent = IGateway(address(gateway)).agentOf(bridgeHubAgentID); - assetHubAgent = IGateway(address(gateway)).agentOf(assetHubAgentID); - - // fund the message relayer account - relayer = makeAddr("relayer"); - - // Features - - token = new WETH9(); - - account1 = makeAddr("account1"); - account2 = makeAddr("account2"); - - // create tokens for account 1 - hoax(account1); - token.deposit{value: 500}(); - - // create tokens for account 2 - token.deposit{value: 500}(); - - recipientAddress32 = multiAddressFromBytes32(keccak256("recipient")); - recipientAddress20 = multiAddressFromBytes20(bytes20(keccak256("recipient"))); - - dotTokenID = bytes32(uint256(1)); - } - - function makeCreateAgentCommand() public pure returns (Command, bytes memory) { - return (Command.CreateAgent, abi.encode((keccak256("6666")))); - } - - function makeLegacyUnlockTokenCommand(bytes32 agentID, address token_, address recipient, uint128 amount) - public - pure - returns (Command, bytes memory) - { - bytes memory payload = abi.encode(token_, recipient, amount); - AgentExecuteParams memory params = - AgentExecuteParams({agentID: agentID, payload: abi.encode(AgentExecuteCommand.TransferToken, payload)}); - return (Command.AgentExecute, abi.encode(params)); - } - - function makeUnlockTokenCommand(bytes32 agentID, address token_, address recipient, uint128 amount) - public - pure - returns (Command, bytes memory) - { - TransferNativeTokenParams memory params = - TransferNativeTokenParams({agentID: agentID, token: token_, recipient: recipient, amount: amount}); - return (Command.TransferNativeToken, abi.encode(params)); - } - - function makeTransferNativeFromAgentCommand(bytes32 agentID, address recipient, uint128 amount) - public - pure - returns (Command, bytes memory) - { - TransferNativeFromAgentParams memory params = - TransferNativeFromAgentParams({agentID: agentID, recipient: recipient, amount: amount}); - return (Command.TransferNativeFromAgent, abi.encode(params)); - } - - function makeMockProof() public pure returns (Verification.Proof memory) { - return Verification.Proof({ - leafPartial: Verification.MMRLeafPartial({ - version: 0, - parentNumber: 0, - parentHash: bytes32(0), - nextAuthoritySetID: 0, - nextAuthoritySetLen: 0, - nextAuthoritySetRoot: 0 - }), - leafProof: new bytes32[](0), - leafProofOrder: 0, - parachainHeadsRoot: bytes32(0) - }); - } - - fallback() external payable {} - - receive() external payable {} - - /** - * Message Verification - */ - function testSubmitHappyPath() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params) = makeCreateAgentCommand(); - - // Expect the gateway to emit `InboundMessageDispatched` - vm.expectEmit(true, false, false, false); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, true); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - function testSubmitFailInvalidNonce() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params) = makeCreateAgentCommand(); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - - // try to replay the message - vm.expectRevert(Gateway.InvalidNonce.selector); - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - function testSubmitFailInvalidChannel() public { - (Command command,) = makeCreateAgentCommand(); - - vm.expectRevert(Gateway.ChannelDoesNotExist.selector); - hoax(relayer); - IGateway(address(gateway)).submitV1( - InboundMessage(ParaID.wrap(42).into(), 1, command, "", maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - function testSubmitFailInvalidProof() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params) = makeCreateAgentCommand(); - - MockGateway(address(gateway)).setCommitmentsAreVerified(false); - vm.expectRevert(Gateway.InvalidProof.selector); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - /** - * Fees & Rewards - */ - - // Test that the Gateway Proxy can receive funds to act as a wallet to pay out rewards and refunds - function testGatewayProxyCanRecieveFunds() public { - uint256 amount = 1 ether; - address deployer = makeAddr("deployer"); - hoax(deployer, amount); - - assertEq(address(gateway).balance, 0); - - vm.expectRevert(GatewayProxy.NativeCurrencyNotAccepted.selector); - SafeNativeTransfer.safeNativeTransfer(payable(gateway), amount); - - IGateway(address(gateway)).depositEther{value: amount}(); - - assertEq(address(gateway).balance, amount); - } - - // Message relayer should be rewarded from the Gatewat Proxy for a channel - function testRelayerRewardedFromGateway() public { - (Command command, bytes memory params) = makeCreateAgentCommand(); - - vm.txGasPrice(10 gwei); - hoax(relayer, 1 ether); - deal(address(gateway), 50 ether); - - uint256 relayerBalanceBefore = address(relayer).balance; - uint256 gatewayBalanceBefore = address(address(gateway)).balance; - uint256 agentBalanceBefore = address(assetHubAgent).balance; - - uint256 startGas = gasleft(); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - uint256 endGas = gasleft(); - uint256 estimatedActualRefundAmount = (startGas - endGas) * tx.gasprice; - assertLt(estimatedActualRefundAmount, maxRefund); - - // Agents do not pay reward+refund so no balance should change. - assertEq(address(assetHubAgent).balance, agentBalanceBefore); - // Relayer balance has increased - assertLt(address(gateway).balance, gatewayBalanceBefore); - // Relayer balance has increased - assertGt(relayer.balance, relayerBalanceBefore); - - // The total amount paid to the relayer - uint256 totalPaid = gatewayBalanceBefore - address(gateway).balance; - - // Since we know that the actual refund amount is less than the max refund, - // the total amount paid to the relayer is less. - assertLt(totalPaid, maxRefund + reward); - } - - // In this case, the Gateway Proxy has no funds to reward the relayer - function testRelayerNotRewarded() public { - (Command command, bytes memory params) = makeCreateAgentCommand(); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - - assertEq(address(assetHubAgent).balance, 0 ether); - assertEq(relayer.balance, 1 ether); - } - - // Users should pay fees to send outbound messages - function testUserPaysFees() public { - // Create a mock user - address user = makeAddr("user"); - deal(address(token), user, 1); - - // register token first - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - IGateway(address(gateway)).registerToken{value: fee}(address(token)); - - fee = IGateway(address(gateway)).quoteSendTokenFee(address(token), ParaID.wrap(0), 1); - - // Let gateway lock up to 1 tokens - hoax(user); - token.approve(address(gateway), 1); - - hoax(user, fee); - IGateway(address(gateway)).sendToken{value: fee}(address(token), ParaID.wrap(0), recipientAddress32, 1, 1); - - assertEq(user.balance, 0); - } - - // User doesn't have enough funds to send message - function testUserDoesNotProvideEnoughFees() public { - // register token first - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - IGateway(address(gateway)).registerToken{value: fee}(address(token)); - - // Create a mock user - address user = makeAddr("user"); - deal(address(token), user, 1); - - // Let gateway lock up to 1 tokens - hoax(user); - token.approve(address(gateway), 1); - - vm.expectRevert(Gateway.InsufficientEther.selector); - hoax(user, 2 ether); - IGateway(address(gateway)).sendToken{value: 0.002 ether}( - address(token), ParaID.wrap(0), recipientAddress32, 1, 1 - ); - - assertEq(user.balance, 2 ether); - } - - /** - * Handlers - */ - function testAgentExecution() public { - token.transfer(address(assetHubAgent), 200); - - TransferNativeTokenParams memory params = TransferNativeTokenParams({ - agentID: assetHubAgentID, - token: address(token), - recipient: account2, - amount: 10 - }); - - bytes memory encodedParams = abi.encode(params); - MockGateway(address(gateway)).transferNativeTokenPublic(encodedParams); - } - - function testAgentExecutionBadPayload() public { - AgentExecuteParams memory params = AgentExecuteParams({agentID: assetHubAgentID, payload: ""}); - - vm.expectRevert(Gateway.InvalidAgentExecutionPayload.selector); - MockGateway(address(gateway)).agentExecutePublic(abi.encode(params)); - } - - function testCreateAgent() public { - bytes32 agentID = keccak256("123"); - CreateAgentParams memory params = CreateAgentParams({agentID: agentID}); - - vm.expectEmit(false, false, false, false, address(gateway)); - emit IGateway.AgentCreated(agentID, address(0)); - - MockGateway(address(gateway)).createAgentPublic(abi.encode(params)); - } - - function testCreateAgentAlreadyCreated() public { - bytes32 agentID = keccak256("123"); - CreateAgentParams memory params = CreateAgentParams({agentID: agentID}); - - MockGateway(address(gateway)).createAgentPublic(abi.encode(params)); - - vm.expectRevert(Gateway.AgentAlreadyCreated.selector); - MockGateway(address(gateway)).createAgentPublic(abi.encode(params)); - } - - function testCreateChannel() public { - ParaID paraID = ParaID.wrap(3042); - bytes32 agentID = keccak256("3042"); - - MockGateway(address(gateway)).createAgentPublic(abi.encode(CreateAgentParams({agentID: agentID}))); - - CreateChannelParams memory params = - CreateChannelParams({channelID: paraID.into(), agentID: agentID, mode: OperatingMode.Normal}); - - vm.expectEmit(true, false, false, true); - emit IGateway.ChannelCreated(paraID.into()); - MockGateway(address(gateway)).createChannelPublic(abi.encode(params)); - } - - function testCreateChannelFailsAgentDoesNotExist() public { - ParaID paraID = ParaID.wrap(3042); - bytes32 agentID = keccak256("3042"); - - CreateChannelParams memory params = - CreateChannelParams({channelID: paraID.into(), mode: OperatingMode.Normal, agentID: agentID}); - - vm.expectRevert(Gateway.AgentDoesNotExist.selector); - MockGateway(address(gateway)).createChannelPublic(abi.encode(params)); - } - - function testCreateChannelFailsChannelAlreadyExists() public { - ParaID paraID = ParaID.wrap(3042); - bytes32 agentID = keccak256("3042"); - - MockGateway(address(gateway)).createAgentPublic(abi.encode(CreateAgentParams({agentID: agentID}))); - - CreateChannelParams memory params = - CreateChannelParams({channelID: paraID.into(), agentID: agentID, mode: OperatingMode.Normal}); - - MockGateway(address(gateway)).createChannelPublic(abi.encode(params)); - - vm.expectRevert(Gateway.ChannelAlreadyCreated.selector); - MockGateway(address(gateway)).createChannelPublic(abi.encode(params)); - } - - function testUpdateChannel() public { - // get current fee (0.0025 ether) - PricingStorage.Layout storage pricing = PricingStorage.layout(); - uint256 fee = pricing.deliveryCost; - - bytes memory params = abi.encode( - UpdateChannelParams({channelID: assetHubParaID.into(), mode: OperatingMode.RejectingOutboundMessages}) - ); - - vm.expectEmit(true, false, false, true); - emit IGateway.ChannelUpdated(assetHubParaID.into()); - MockGateway(address(gateway)).updateChannelPublic(params); - - // Due to the new exchange rate, new fee is halved - uint256 newFee = pricing.deliveryCost; - assertEq(fee / 2, newFee); - } - - function testUpdateChannelFailDoesNotExist() public { - bytes memory params = abi.encode( - UpdateChannelParams({channelID: ParaID.wrap(5956).into(), mode: OperatingMode.RejectingOutboundMessages}) - ); - - vm.expectRevert(Gateway.ChannelDoesNotExist.selector); - MockGateway(address(gateway)).updateChannelPublic(params); - } - - function testUpdateChannelSanityChecksForPrimaryGovernanceChannel() public { - bytes memory params = abi.encode( - UpdateChannelParams({ - channelID: ChannelID.wrap(bytes32(uint256(1))), - mode: OperatingMode.RejectingOutboundMessages - }) - ); - - vm.expectRevert(Gateway.InvalidChannelUpdate.selector); - MockGateway(address(gateway)).updateChannelPublic(params); - } - - function testUpgrade() public { - // Upgrade to this new logic contract - MockGatewayV2 newLogic = new MockGatewayV2(); - - UpgradeParams memory params = UpgradeParams({ - impl: address(newLogic), - implCodeHash: address(newLogic).codehash, - initParams: abi.encode(42) - }); - - // Expect the gateway to emit `Upgraded` - vm.expectEmit(true, false, false, false); - emit IUpgradable.Upgraded(address(newLogic)); - - MockGateway(address(gateway)).upgradePublic(abi.encode(params)); - - // Verify that the MockGatewayV2.initialize was called - assertEq(MockGatewayV2(address(gateway)).getValue(), 42); - } - - function testUpgradeFailOnInitializationFailure() public { - MockGatewayV2 newLogic = new MockGatewayV2(); - - UpgradeParams memory params = UpgradeParams({ - impl: address(newLogic), - implCodeHash: address(newLogic).codehash, - initParams: abi.encode(666) - }); - - vm.expectRevert("initialize failed"); - MockGateway(address(gateway)).upgradePublic(abi.encode(params)); - } - - function testUpgradeFailCodeHashMismatch() public { - MockGatewayV2 newLogic = new MockGatewayV2(); - - UpgradeParams memory params = - UpgradeParams({impl: address(newLogic), implCodeHash: bytes32(0), initParams: abi.encode(42)}); - - vm.expectRevert(IUpgradable.InvalidCodeHash.selector); - MockGateway(address(gateway)).upgradePublic(abi.encode(params)); - } - - function testSetOperatingMode() public { - SetOperatingModeParams memory params = SetOperatingModeParams({mode: OperatingMode.RejectingOutboundMessages}); - - OperatingMode mode = IGateway(address(gateway)).operatingMode(); - assertEq(uint256(mode), 0); - - MockGateway(address(gateway)).setOperatingModePublic(abi.encode(params)); - - mode = IGateway(address(gateway)).operatingMode(); - assertEq(uint256(mode), 1); - } - - function testWithdrawAgentFundIsSuccessful() public { - address recipient = makeAddr("test_recipeint"); - uint128 amount = 1; - - deal(assetHubAgent, amount); - - (Command command, bytes memory params) = makeTransferNativeFromAgentCommand(assetHubAgentID, recipient, amount); - - assertEq(address(assetHubAgent).balance, amount); - assertEq(recipient.balance, 0); - - // Expect the gateway to emit `InboundMessageDispatched` - vm.expectEmit(); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, true); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - - assertEq(address(assetHubAgent).balance, 0); - assertEq(recipient.balance, 1); - } - - /** - * Assets - */ - function testRegisterToken() public { - vm.expectEmit(false, false, false, true); - emit IGateway.TokenRegistrationSent(address(token)); - - vm.expectEmit(true, false, false, false); - emit IGateway.OutboundMessageAccepted(assetHubParaID.into(), 1, messageID, bytes("")); - - IGateway(address(gateway)).registerToken{value: 2 ether}(address(token)); - } - - function testRegisterTokenReimbursesExcessFees() public { - vm.expectEmit(false, false, false, true); - emit IGateway.TokenRegistrationSent(address(token)); - - vm.expectEmit(true, false, false, false); - emit IGateway.OutboundMessageAccepted(assetHubParaID.into(), 1, messageID, bytes("")); - - uint256 totalFee = MockGateway(address(gateway)).quoteRegisterTokenFee(); - - uint256 balanceBefore = address(this).balance; - IGateway(address(gateway)).registerToken{value: totalFee + 1 ether}(address(token)); - uint256 balanceAfter = address(this).balance; - - // Check that the balance has decreased by the amount of gas used - // channel.fee is baseFee & extraFee is registerNativeTokenFee - uint256 etherUsed = balanceBefore - balanceAfter; - assert(etherUsed == totalFee); - } - - function testSendTokenAddress32() public { - // Let gateway lock up to 1 tokens - token.approve(address(gateway), 1); - - // Multilocation for recipient - ParaID destPara = ParaID.wrap(2043); - - // register token first - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - IGateway(address(gateway)).registerToken{value: fee}(address(token)); - - fee = IGateway(address(gateway)).quoteSendTokenFee(address(token), destPara, 1); - - vm.expectEmit(true, true, false, true); - emit IGateway.TokenSent(address(token), address(this), destPara, recipientAddress32, 1); - - // Expect the gateway to emit `OutboundMessageAccepted` - vm.expectEmit(true, false, false, false); - emit IGateway.OutboundMessageAccepted(assetHubParaID.into(), 1, messageID, bytes("")); - - IGateway(address(gateway)).sendToken{value: fee}(address(token), destPara, recipientAddress32, 1, 1); - } - - function testSendTokenAddress32ToAssetHub() public { - // Let gateway lock up to 1 tokens - token.approve(address(gateway), 1); - - // Multilocation for recipient - ParaID destPara = assetHubParaID; - - // register token first - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - IGateway(address(gateway)).registerToken{value: fee}(address(token)); - - fee = IGateway(address(gateway)).quoteSendTokenFee(address(token), destPara, 1); - - vm.expectEmit(true, true, false, true); - emit IGateway.TokenSent(address(token), address(this), destPara, recipientAddress32, 1); - - // Expect the gateway to emit `OutboundMessageAccepted` - vm.expectEmit(true, false, false, false); - emit IGateway.OutboundMessageAccepted(assetHubParaID.into(), 1, messageID, bytes("")); - - IGateway(address(gateway)).sendToken{value: fee}(address(token), destPara, recipientAddress32, 1, 1); - } - - function testSendTokenAddress20() public { - // Let gateway lock up to 1 tokens - token.approve(address(gateway), 1); - - // Multilocation for recipient - ParaID destPara = ParaID.wrap(2043); - - // register token first - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - IGateway(address(gateway)).registerToken{value: fee}(address(token)); - - fee = IGateway(address(gateway)).quoteSendTokenFee(address(token), destPara, 1); - - vm.expectEmit(true, true, false, true); - emit IGateway.TokenSent(address(token), address(this), destPara, recipientAddress20, 1); - - // Expect the gateway to emit `OutboundMessageAccepted` - vm.expectEmit(true, false, false, false); - emit IGateway.OutboundMessageAccepted(assetHubParaID.into(), 1, messageID, bytes("")); - - IGateway(address(gateway)).sendToken{value: fee}(address(token), destPara, recipientAddress20, 1, 1); - } - - function testSendTokenAddress20FailsInvalidDestination() public { - // Let gateway lock up to 1 tokens - token.approve(address(gateway), 1); - - ParaID destPara = assetHubParaID; - - // register token first - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - IGateway(address(gateway)).registerToken{value: fee}(address(token)); - - // Should fail to send tokens to AssetHub - vm.expectRevert(Assets.Unsupported.selector); - IGateway(address(gateway)).sendToken{value: 2 ether}(address(token), destPara, recipientAddress20, 1, 1); - } - - /** - * Operating Modes - */ - function testDisableOutboundMessaging() public { - // Let gateway lock up to 1 tokens - token.approve(address(gateway), 1); - - MockGateway(address(gateway)).setOperatingModePublic( - abi.encode(SetOperatingModeParams({mode: OperatingMode.RejectingOutboundMessages})) - ); - - OperatingMode mode = IGateway(address(gateway)).operatingMode(); - assertEq(uint256(mode), 1); - } - - function testDisableOutboundMessagingForChannel() public { - // Let gateway lock up to 1 tokens - token.approve(address(gateway), 1); - - MockGateway(address(gateway)).setOperatingModePublic( - abi.encode(SetOperatingModeParams({mode: OperatingMode.Normal})) - ); - - // register token first - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - IGateway(address(gateway)).registerToken{value: fee}(address(token)); - - bytes memory params = abi.encode( - UpdateChannelParams({channelID: assetHubParaID.into(), mode: OperatingMode.RejectingOutboundMessages}) - ); - MockGateway(address(gateway)).updateChannelPublic(params); - - OperatingMode mode = IGateway(address(gateway)).channelOperatingModeOf(assetHubParaID.into()); - assertEq(uint256(mode), 1); - - // Now all outbound messaging should be disabled - - vm.expectRevert(Gateway.Disabled.selector); - IGateway(address(gateway)).registerToken{value: 1 ether}(address(token)); - - vm.expectRevert(Gateway.Disabled.selector); - IGateway(address(gateway)).sendToken{value: 1 ether}(address(token), ParaID.wrap(0), recipientAddress32, 1, 1); - } - - /** - * Misc checks - */ - - // Initialize function should not be externally callable on either proxy or implementation contract - function testInitializeNotExternallyCallable() public { - vm.expectRevert(Gateway.Unauthorized.selector); - Gateway(address(gateway)).initialize(""); - - vm.expectRevert(Gateway.Unauthorized.selector); - MockGateway(address(gatewayLogic)).initialize(""); - } - - // Handler functions should not be externally callable - function testHandlersNotExternallyCallable() public { - vm.expectRevert(Gateway.Unauthorized.selector); - Gateway(address(gateway)).createAgent(""); - - vm.expectRevert(Gateway.Unauthorized.selector); - Gateway(address(gateway)).createChannel(""); - - vm.expectRevert(Gateway.Unauthorized.selector); - Gateway(address(gateway)).updateChannel(""); - - vm.expectRevert(Gateway.Unauthorized.selector); - Gateway(address(gateway)).setOperatingMode(""); - - vm.expectRevert(Gateway.Unauthorized.selector); - Gateway(address(gateway)).upgrade(""); - - vm.expectRevert(Gateway.Unauthorized.selector); - Gateway(address(gateway)).transferNativeFromAgent(""); - } - - function testGetters() public { - IGateway gw = IGateway(address(gateway)); - - OperatingMode mode = gw.operatingMode(); - assertEq(uint256(mode), 0); - - OperatingMode channelMode = gw.channelOperatingModeOf(assetHubParaID.into()); - assertEq(uint256(channelMode), 0); - - (, uint128 fee) = gw.pricingParameters(); - assertEq(fee, 10000000000); - - (uint64 inbound, uint64 outbound) = gw.channelNoncesOf(assetHubParaID.into()); - assertEq(inbound, 0); - assertEq(outbound, 0); - - address agent = gw.agentOf(assetHubAgentID); - assertEq(agent, assetHubAgent); - - address implementation = gw.implementation(); - assertEq(implementation, address(gatewayLogic)); - } - - function testCreateAgentWithNotEnoughGas() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params) = makeCreateAgentCommand(); - - hoax(relayer, 1 ether); - - vm.expectEmit(true, false, false, true); - // Expect dispatch result as false for `OutOfGas` - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, false); - // maxDispatchGas as 1 for `create_agent` is definitely not enough - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, 1, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - function testSetTokenFees() public { - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - assertEq(fee, 5000000000000000); - // Double the assetHubCreateAssetFee - MockGateway(address(gateway)).setTokenTransferFeesPublic( - abi.encode( - SetTokenTransferFeesParams({ - assetHubCreateAssetFee: createTokenFee * 2, - registerTokenFee: registerTokenFee, - assetHubReserveTransferFee: sendTokenFee * 3 - }) - ) - ); - fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - // since deliveryCost not changed, so the total fee increased only by 50% - assertEq(fee, 7500000000000000); - } - - bytes32 public expectChannelIDBytes = bytes32(0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539); - - function testDeriveChannelID() public { - ParaID para_id = ParaID.wrap(1000); - ChannelID channel_id = para_id.into(); - assertEq(ChannelID.unwrap(channel_id), expectChannelIDBytes); - } - - function testSetPricingParameters() public { - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - assertEq(fee, 5000000000000000); - // Double both the exchangeRate and multiplier. Should lead to an 4x fee increase - MockGateway(address(gateway)).setPricingParametersPublic( - abi.encode( - SetPricingParametersParams({ - exchangeRate: exchangeRate.mul(convert(2)), - multiplier: multiplier.mul(convert(2)), - deliveryCost: outboundFee - }) - ) - ); - // Should expect 4x fee increase - fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - assertEq(fee, 20000000000000001); - } - - function testSendTokenWithZeroDestinationFee() public { - // Let gateway lock up to 1 tokens - token.approve(address(gateway), 1); - - // Multilocation for recipient - ParaID destPara = ParaID.wrap(2043); - - // register token first - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - IGateway(address(gateway)).registerToken{value: fee}(address(token)); - fee = IGateway(address(gateway)).quoteSendTokenFee(address(token), destPara, 0); - - vm.expectRevert(Assets.InvalidDestinationFee.selector); - IGateway(address(gateway)).sendToken{value: fee}(address(token), destPara, recipientAddress32, 0, 1); - } - - function testSendTokenWithLargeDestinationFee() public { - // Let gateway lock up to 1 tokens - token.approve(address(gateway), 1); - - // Multilocation for recipient - ParaID destPara = ParaID.wrap(2043); - - // register token first - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - IGateway(address(gateway)).registerToken{value: fee}(address(token)); - - vm.expectRevert(Assets.InvalidDestinationFee.selector); - IGateway(address(gateway)).quoteSendTokenFee(address(token), destPara, maxDestinationFee + 1); - - vm.expectRevert(Assets.InvalidDestinationFee.selector); - IGateway(address(gateway)).sendToken{value: fee}( - address(token), destPara, recipientAddress32, maxDestinationFee + 1, 1 - ); - } - - function testRegisterForeignToken() public { - RegisterForeignTokenParams memory params = - RegisterForeignTokenParams({foreignTokenID: dotTokenID, name: "DOT", symbol: "DOT", decimals: 10}); - - vm.expectEmit(true, true, false, false); - emit IGateway.ForeignTokenRegistered(bytes32(uint256(1)), address(0)); - - MockGateway(address(gateway)).registerForeignTokenPublic(abi.encode(params)); - } - - function testRegisterForeignTokenDuplicateFail() public { - testRegisterForeignToken(); - - RegisterForeignTokenParams memory params = - RegisterForeignTokenParams({foreignTokenID: dotTokenID, name: "DOT", symbol: "DOT", decimals: 10}); - - vm.expectRevert(Assets.TokenAlreadyRegistered.selector); - - MockGateway(address(gateway)).registerForeignTokenPublic(abi.encode(params)); - } - - function testMintForeignToken() public { - testRegisterForeignToken(); - - uint256 amount = 1000; - - MintForeignTokenParams memory params = - MintForeignTokenParams({foreignTokenID: bytes32(uint256(1)), recipient: account1, amount: amount}); - - vm.expectEmit(true, true, false, false); - emit Transfer(address(0), account1, 1000); - - MockGateway(address(gateway)).mintForeignTokenPublic(abi.encode(params)); - - address dotToken = MockGateway(address(gateway)).tokenAddressOf(dotTokenID); - - uint256 balance = Token(dotToken).balanceOf(account1); - - assertEq(balance, amount); - } - - function testMintNotRegisteredTokenWillFail() public { - MintForeignTokenParams memory params = - MintForeignTokenParams({foreignTokenID: bytes32(uint256(1)), recipient: account1, amount: 1000}); - - vm.expectRevert(Assets.TokenNotRegistered.selector); - - MockGateway(address(gateway)).mintForeignTokenPublic(abi.encode(params)); - } - - function testSendRelayTokenToAssetHubWithAddress32() public { - // Register and then mint some DOT to account1 - testMintForeignToken(); - - address dotToken = MockGateway(address(gateway)).tokenAddressOf(dotTokenID); - - ParaID destPara = assetHubParaID; - - vm.prank(account1); - - vm.expectEmit(true, true, false, true); - emit IGateway.TokenSent(address(dotToken), account1, destPara, recipientAddress32, 1); - - // Expect the gateway to emit `OutboundMessageAccepted` - vm.expectEmit(true, false, false, false); - emit IGateway.OutboundMessageAccepted(assetHubParaID.into(), 1, messageID, bytes("")); - - IGateway(address(gateway)).sendToken{value: 0.1 ether}(address(dotToken), destPara, recipientAddress32, 1, 1); - } - - function testSendRelayTokenToAssetHubWithAddress20() public { - // Register and then mint some DOT to account1 - testMintForeignToken(); - - address dotToken = MockGateway(address(gateway)).tokenAddressOf(dotTokenID); - - ParaID destPara = assetHubParaID; - - vm.prank(account1); - - vm.expectRevert(Assets.Unsupported.selector); - IGateway(address(gateway)).sendToken{value: 0.1 ether}(address(dotToken), destPara, recipientAddress20, 1, 1); - } - - function testSendRelayTokenToDestinationChainWithAddress32() public { - // Register and then mint some DOT to account1 - testMintForeignToken(); - - address dotToken = MockGateway(address(gateway)).tokenAddressOf(dotTokenID); - - ParaID destPara = ParaID.wrap(2043); - - vm.prank(account1); - - vm.expectRevert(Assets.Unsupported.selector); - IGateway(address(gateway)).sendToken{value: 0.1 ether}(address(dotToken), destPara, recipientAddress32, 1, 1); - } - - function testSendRelayTokenToDestinationChainWithAddress20() public { - // Register and then mint some DOT to account1 - testMintForeignToken(); - - address dotToken = MockGateway(address(gateway)).tokenAddressOf(dotTokenID); - - ParaID destPara = ParaID.wrap(2043); - - vm.prank(account1); - - vm.expectRevert(Assets.Unsupported.selector); - IGateway(address(gateway)).sendToken{value: 0.1 ether}(address(dotToken), destPara, recipientAddress20, 1, 1); - } - - function testSendNotRegisteredTokenWillFail() public { - ParaID destPara = assetHubParaID; - - vm.expectRevert(Assets.TokenNotRegistered.selector); - - IGateway(address(gateway)).sendToken{value: 0.1 ether}(address(0x1), destPara, recipientAddress32, 1, 1); - } - - function testSendTokenFromNotMintedAccountWillFail() public { - testRegisterForeignToken(); - - address dotToken = MockGateway(address(gateway)).tokenAddressOf(dotTokenID); - - ParaID destPara = assetHubParaID; - - vm.prank(account1); - - vm.expectRevert(abi.encodeWithSelector(IERC20.InsufficientBalance.selector, account1, 0, 1)); - - IGateway(address(gateway)).sendToken{value: 0.1 ether}(address(dotToken), destPara, recipientAddress32, 1, 1); - } - - function testLegacyAgentExecutionForCompatibility() public { - token.transfer(address(assetHubAgent), 200); - - AgentExecuteParams memory params = AgentExecuteParams({ - agentID: assetHubAgentID, - payload: abi.encode(AgentExecuteCommand.TransferToken, abi.encode(address(token), address(account2), 10)) - }); - - bytes memory encodedParams = abi.encode(params); - MockGateway(address(gateway)).agentExecutePublic(encodedParams); - } - - function testUpgradeOnlyOwner() public { - // Upgrade to this new logic contract - MockGatewayV2 newLogic = new MockGatewayV2(); - - UpgradeParams memory params = UpgradeParams({ - impl: address(newLogic), - implCodeHash: address(newLogic).codehash, - initParams: abi.encode(42) - }); - - // Expect the gateway to emit `Upgraded` - vm.expectEmit(true, false, false, false); - emit IUpgradable.Upgraded(address(newLogic)); - - MockGateway(address(gateway)).upgradeOnlyOwner(abi.encode(params)); - - // Verify that the MockGatewayV2.initialize was called - assertEq(MockGatewayV2(address(gateway)).getValue(), 42); - } - - function testUpgradeNotOnlyOwner() public { - // Upgrade to this new logic contract - MockGatewayV2 newLogic = new MockGatewayV2(); - - UpgradeParams memory params = UpgradeParams({ - impl: address(newLogic), - implCodeHash: address(newLogic).codehash, - initParams: abi.encode(42) - }); - - address notOwner = makeAddr("notOwner"); - vm.prank(notOwner); - vm.expectRevert(abi.encodeWithSelector(Gateway.Unauthorized.selector)); - MockGateway(address(gateway)).upgradeOnlyOwner(abi.encode(params)); - } -} diff --git a/overridden_contracts/test/data/beefy-commitment.json b/overridden_contracts/test/data/beefy-commitment.json deleted file mode 100644 index ac5e965..0000000 --- a/overridden_contracts/test/data/beefy-commitment.json +++ /dev/null @@ -1,422 +0,0 @@ -{ - "@timestamp": "2025-01-16T12:27:17.11181+04:00", - "commitmentHash": "0xfae1f43ae7c9a1a70c7911d3559490dfb5790c89b97ff7495cd56b62740c7709", - "level": "info", - "message": "Sent SubmitFinal transaction", - "params": { - "bitfield": [ - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100011111110011111000010111101011111111111100100100111110111110010110111" - ], - "commitment": { - "blockNumber": 111, - "payload": [ - { - "data": "0x00ff0efeb321e6ccc996758b74355dc0840db3dbc584f45f0367446724335d61", - "payloadID": "mh" - } - ], - "validatorSetID": 11 - }, - "leaf": { - "messageCommitment": "0x0000000000000000000000000000000000000000000000000000000000000000", - "nextAuthoritySetID": 12, - "nextAuthoritySetLen": 73, - "nextAuthoritySetRoot": "0x3402fd2cd198f74e3e45a20012f4da29a3a41d4fdd0158cf1ac1cf0d2e5ed184", - "parachainHeadsRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x6712d6c8b6321e68a1d5595dcbf45bcdb9d459a56f5d9be48847db9251d68f3f", - "parentNumber": 110, - "version": 0 - }, - "leafProof": [ - "0xd2e3e52ae0365ca3c6bf94fe38fb8583d3f48484b22afb87d3345ae8c56b5ff2", - "0xe57d4ae434bbb6c45fe7d3124b5369c2f72caeff2780c7166e4132d2d9a9ef8f", - "0xa9287e85b324f490b6c6fe3e7c327ebc6283b80c1d482cd71d29f1e1034fcdd4", - "0x1c7165f3babc3055f50bbb4cba07327423c87bf9203f039b37666689d4260dec", - "0xf366dfd2d8adfa2aabae231366f6efda4bfad3750fbaf2086f2430a0f1a19d21" - ], - "leafProofOrder": 0, - "proofs": [ - { - "Account": "0xE04CC55ebEE1cBCE552f250e85c57B70B2E2625b", - "Index": 0, - "Proof": [ - "0xf68aec7304bf37f340dae2ea20fb5271ee28a3128812b84a615da4789e458bde", - "0x4cfe8d1b211e869a3955acad4cf3a80071557ee9558789ef1a5006723832bfac", - "0xa0db8cafd8aab8c70bf7f38d0fa9c795b8bb52123aaac4a2e67280369c3427ba", - "0x5620be475a616921a500ac464167df997361db12e0808bcc30b8ad349177abe7", - "0xe3bcab7b2e405c2c9d7502883a638291e7ff03deee0d782ef719f047aac1f5a6", - "0xc036283f06a90c9193173c2eb58b64590fd8553f81527c63941a7a1c2eec1917", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xeda7fd9f122f83830b3de850cbe14f21d7be4d37c5834adb8f8de1978c7250b9", - "S": "0x00a635bc5d09097d6f1dae4ffac533af1f5267c5e101e93b086ad07626d03b12", - "V": 27 - }, - { - "Account": "0x25451A4de12dcCc2D166922fA938E900fCc4ED24", - "Index": 1, - "Proof": [ - "0xaeb47a269393297f4b0a3c9c9cfd00c7a4195255274cf39d83dabc2fcc9ff3d7", - "0x4cfe8d1b211e869a3955acad4cf3a80071557ee9558789ef1a5006723832bfac", - "0xa0db8cafd8aab8c70bf7f38d0fa9c795b8bb52123aaac4a2e67280369c3427ba", - "0x5620be475a616921a500ac464167df997361db12e0808bcc30b8ad349177abe7", - "0xe3bcab7b2e405c2c9d7502883a638291e7ff03deee0d782ef719f047aac1f5a6", - "0xc036283f06a90c9193173c2eb58b64590fd8553f81527c63941a7a1c2eec1917", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xc78db5f264fdfe5eec54a6653d0c1196d134a7dc0deb804f84e8270617d637e4", - "S": "0x2ffa8cfd0dbf3488eed36e0dc5482b8a4368f47f4d7c8d0d7feab70aa2c53d07", - "V": 27 - }, - { - "Account": "0xc62a3A2fbea6B2998d0d9139168a67dCbb38B211", - "Index": 2, - "Proof": [ - "0xbb2ddfc45b036e9a41406d0466ef4f3c1710c1360fa1634bbdf4fdb23c7de9f9", - "0x697ea2a8fe5b03468548a7a413424a6292ab44a82a6f5cc594c3fa7dda7ce402", - "0xa0db8cafd8aab8c70bf7f38d0fa9c795b8bb52123aaac4a2e67280369c3427ba", - "0x5620be475a616921a500ac464167df997361db12e0808bcc30b8ad349177abe7", - "0xe3bcab7b2e405c2c9d7502883a638291e7ff03deee0d782ef719f047aac1f5a6", - "0xc036283f06a90c9193173c2eb58b64590fd8553f81527c63941a7a1c2eec1917", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x30aa1eb0b11671a9f91a373fb6882effd0d425d6b86e515a50847e9c4cc4c053", - "S": "0x445efb19a95d6e64e5b3524a4c1d4f0b7c84a99ab53f92cda59d9447f5614863", - "V": 28 - }, - { - "Account": "0xFBa80FdE4BD9305014e33e1e89A72B82b095fa19", - "Index": 4, - "Proof": [ - "0x8c0294cd9c241410e8736e2c9c4a30ed146d0856ed1719b6c5e1b6783a401004", - "0xf704228b0e1dc6949ae398eb8b699b708621b2fd8d68e86e84e8d0e23ce20254", - "0x5abadbd288788e1a0422503173094a116b4b866c1ff38a428b5a82517d36f2c3", - "0x5620be475a616921a500ac464167df997361db12e0808bcc30b8ad349177abe7", - "0xe3bcab7b2e405c2c9d7502883a638291e7ff03deee0d782ef719f047aac1f5a6", - "0xc036283f06a90c9193173c2eb58b64590fd8553f81527c63941a7a1c2eec1917", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x35f32bdbaf214ca240e0c118cb6345e8e57d467d388faf4a6ed68242d39e7b7b", - "S": "0x163fce464a66bd4e2cb87731a38c87d13deeb1aa8efb05f512520a0bc7195fe6", - "V": 27 - }, - { - "Account": "0x6498f0F72F23e62a1F8252F639759F9AC144B29B", - "Index": 5, - "Proof": [ - "0x5c032ddc3c88e3cd4bbeeea5dff5f7e3389362c5508cf20e62b8cb72ae98f869", - "0xf704228b0e1dc6949ae398eb8b699b708621b2fd8d68e86e84e8d0e23ce20254", - "0x5abadbd288788e1a0422503173094a116b4b866c1ff38a428b5a82517d36f2c3", - "0x5620be475a616921a500ac464167df997361db12e0808bcc30b8ad349177abe7", - "0xe3bcab7b2e405c2c9d7502883a638291e7ff03deee0d782ef719f047aac1f5a6", - "0xc036283f06a90c9193173c2eb58b64590fd8553f81527c63941a7a1c2eec1917", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x8eccf868560103189ddd4e589fad705401246a241baca59c97432d108caa5a8d", - "S": "0x13eb91d4f7dfd11f40700b75677636f2b5c7162e8553d69522c5982ae5a2a187", - "V": 28 - }, - { - "Account": "0x0C8A57c77e50afC224f06CaeECa12C46178B37c7", - "Index": 12, - "Proof": [ - "0xb5594077138bc40880a052f9ae5a3197f6dcf26532841a314ce80b00ec96289e", - "0x4184f6d62a7f77e879dd96b2ee931eff962685265e18f48ffe809762adc7a7ff", - "0x2f8f737067b9550138788cc3622d38e20b349ea219b1b9094419ad0833f6f135", - "0xe8ab5fade5f99212eeac05310c7559090576b33ca9e32e97d504750c336290eb", - "0xe3bcab7b2e405c2c9d7502883a638291e7ff03deee0d782ef719f047aac1f5a6", - "0xc036283f06a90c9193173c2eb58b64590fd8553f81527c63941a7a1c2eec1917", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xaf4ee48f6e2cf265d061e68398d1018f7ad5868529c06ae83d2dcbe8402e6e97", - "S": "0x313a5bf29b352fb473a5aae72abece8ab0d715cf0b49d8e7d3c35b04652d2e89", - "V": 28 - }, - { - "Account": "0x93C673Cb8A920521A4E2722E65102C6fD66a93B4", - "Index": 17, - "Proof": [ - "0x1fa3483c36ec680e6c938e0c0a4680af2f5fe3d1e582f8a23ae8a594b25b6b6a", - "0x338bb40d0a85ce7ab76fc357f78053d808e34a5f651135f8ff6b81fab4abb130", - "0xb96147ff4407ada82bc2a49255b2874712df78f2a93adcaeab530870734234fe", - "0xa852ec36afa17c5552d40cdb186dc361c41da127a59c1f79388d03467d45ef93", - "0xad3724c02308f5307103a2dad4278f531d22472a08ced15bedee2c959e45ac49", - "0xc036283f06a90c9193173c2eb58b64590fd8553f81527c63941a7a1c2eec1917", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x815187541f50e4b0e15c711c15cf46ea24e830ed3035d4d2109606f01fd1669b", - "S": "0x5e8880a518b66a95757622c4f865958d929050f1404f008a7678ed589452c571", - "V": 27 - }, - { - "Account": "0xC52494CB85B784862eD06dE78807073D988A6b6E", - "Index": 19, - "Proof": [ - "0x795be6f02662c923a30b3cc7e63fc5b1057f8ff67738990c643270bb60cb5f1b", - "0xa6df362e32baaeb0db38ecc8310591e331b82554e88b87111aa841d314c80917", - "0xb96147ff4407ada82bc2a49255b2874712df78f2a93adcaeab530870734234fe", - "0xa852ec36afa17c5552d40cdb186dc361c41da127a59c1f79388d03467d45ef93", - "0xad3724c02308f5307103a2dad4278f531d22472a08ced15bedee2c959e45ac49", - "0xc036283f06a90c9193173c2eb58b64590fd8553f81527c63941a7a1c2eec1917", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xef9d447b82a05575685963236d58b79c1f0254eff3db8269d9ed7d26eb165084", - "S": "0x63bb7791181d4fc90bcfee02cd683aaf8dddade58163a5fc5f6aa5005e8ecb76", - "V": 28 - }, - { - "Account": "0x193A8fFe01EdeaD91aD36c1BAdaB02a66a9F4778", - "Index": 30, - "Proof": [ - "0xe71b96951ba72a0b584cdb599844c78c35d50516b12fb6d9e9eacb8cbec9e010", - "0x2bb85ec5f2d106f1b6c71dd3fe04ea0892282d6b887645523b4673636cfff356", - "0x1a6b7eeb18941dba6f82773a4da83bbeaf4cae46f50e949c51e85ce4b6464a68", - "0x9f748f92b1d29e9c43418f54a5a703298877107e6d6ce9379c22597454a48875", - "0xad3724c02308f5307103a2dad4278f531d22472a08ced15bedee2c959e45ac49", - "0xc036283f06a90c9193173c2eb58b64590fd8553f81527c63941a7a1c2eec1917", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xc060ee7b1ab038d485f7ff4a90e49ac5dea4cbce4fa5b91c667347ad3d7feea4", - "S": "0x02dcb9cf93b379a257dbe66eee6ae965e351e45786428b2312352715a097ebc9", - "V": 28 - }, - { - "Account": "0x69B62139e717B68d83625Ebe6BfB3D09d67c3d72", - "Index": 32, - "Proof": [ - "0xd872b7b65b93356be63e944a25c9032c72e8013ebebd45221674f0e1c1344cba", - "0xc4ecea77244a20b2271eccbb05c2a4528d2c49d3213b074cdfbaf8146e5f61c9", - "0x51d3ee9b7286d5659ae93d8b483cfff7024ff56a13ed4ee872ec30e731777324", - "0x244d01eef112f4ee84d9b5ec500710e303aacaa628c11d67f585556ddd24d3aa", - "0xdf6b1d6bc153f1ec2ee4d92c9b95ad36d364926aac3fd0d1e27e42afd4c3b31d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xed47893ae51eac1992f1de61648fd1001a26d2423e44a55b64f98e59955c7f8e", - "S": "0x3b085f0019b6a9a74ecdb6727566f6f4d0963c00439f9f5bc4399707f032b2ba", - "V": 28 - }, - { - "Account": "0x3439C6272E1d1f08CBeAeBc7db32d9B3AF4bab41", - "Index": 33, - "Proof": [ - "0x99e186fd8b0a49778d9929e9113bd66f34b87a00737bbe5fddceacb154af87de", - "0xc4ecea77244a20b2271eccbb05c2a4528d2c49d3213b074cdfbaf8146e5f61c9", - "0x51d3ee9b7286d5659ae93d8b483cfff7024ff56a13ed4ee872ec30e731777324", - "0x244d01eef112f4ee84d9b5ec500710e303aacaa628c11d67f585556ddd24d3aa", - "0xdf6b1d6bc153f1ec2ee4d92c9b95ad36d364926aac3fd0d1e27e42afd4c3b31d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xf095c52c4904d2d6900f236abed0499fc6bf2207a648a13c1923ce2507b833a1", - "S": "0x31dc5dc8739722babbd42b399ec3959013988cc62f2c6c87debfced38fbe16c6", - "V": 28 - }, - { - "Account": "0x32B271f5952B2adaD531365a6d85efafba8F76Ea", - "Index": 34, - "Proof": [ - "0x11495fceb5963260e04e068b915485f886d35289fe96b38e10b45013ee7b2588", - "0xb77a8b29d46306d2106844184d3a7b0fa1cad040103a299a7dc662f2028c8c0d", - "0x51d3ee9b7286d5659ae93d8b483cfff7024ff56a13ed4ee872ec30e731777324", - "0x244d01eef112f4ee84d9b5ec500710e303aacaa628c11d67f585556ddd24d3aa", - "0xdf6b1d6bc153f1ec2ee4d92c9b95ad36d364926aac3fd0d1e27e42afd4c3b31d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x556d06767d9665773c96fe77256a7101fed4e0a68b9bb9157198ec9d370cfc59", - "S": "0x7c3485876d29ffc37d2733c6519c8c2a60b2043529a22cbd913ecd2a7f673baa", - "V": 28 - }, - { - "Account": "0xaBD08cd1AEDEc2A9c7c52798ACA106e221133Cb6", - "Index": 35, - "Proof": [ - "0x607b13836bb8b8036ea84aa71e56800fbdc662dfb342f2291d01ddab3ba68edf", - "0xb77a8b29d46306d2106844184d3a7b0fa1cad040103a299a7dc662f2028c8c0d", - "0x51d3ee9b7286d5659ae93d8b483cfff7024ff56a13ed4ee872ec30e731777324", - "0x244d01eef112f4ee84d9b5ec500710e303aacaa628c11d67f585556ddd24d3aa", - "0xdf6b1d6bc153f1ec2ee4d92c9b95ad36d364926aac3fd0d1e27e42afd4c3b31d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xf7b349f2ed33ce9b9790c2810a330cb2d4e8bf9e3d63a0880bd5448abd7b97d4", - "S": "0x484c886a6f4bf62e5fa7cced74ab09174473f1f4e48fee0a0f67ec66a9ba2bcb", - "V": 28 - }, - { - "Account": "0xE2679cB0E0AFef928115D2eD8ce928216285bF05", - "Index": 37, - "Proof": [ - "0x6dd4b2ed8ec256b21270b2241f412094c2554f1b941e77bc73021a217fa33b44", - "0xbb32279fbe18e74c37feccf554c6bcf5e16afc8627c6ec37178810e296bf7873", - "0x8d9e697b246bbdee48bf6294c139bcd8bd2e70703761f0901ac9c488fc7d6fde", - "0x244d01eef112f4ee84d9b5ec500710e303aacaa628c11d67f585556ddd24d3aa", - "0xdf6b1d6bc153f1ec2ee4d92c9b95ad36d364926aac3fd0d1e27e42afd4c3b31d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x07a62148d22c3d02b19486266b859389c60eb1340d212ae7ac41de73bc8e1a03", - "S": "0x1c8e02117220f5f8465ebe2b32217770cb19927d47b1ff61f9d59e3e2b2e1386", - "V": 27 - }, - { - "Account": "0x81158f7273C6B6b3edE9F6C92AA5b5d71fdC8045", - "Index": 38, - "Proof": [ - "0x4c6ddd7936574b3a825f5e628dd5b547acb677b7daaa0ae6701422f6fc667147", - "0x84af222c7e6c0ffce1d548800ff67fffea86bd25293ed83c7b90be7be789b975", - "0x8d9e697b246bbdee48bf6294c139bcd8bd2e70703761f0901ac9c488fc7d6fde", - "0x244d01eef112f4ee84d9b5ec500710e303aacaa628c11d67f585556ddd24d3aa", - "0xdf6b1d6bc153f1ec2ee4d92c9b95ad36d364926aac3fd0d1e27e42afd4c3b31d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x7b594944852b191e144160a11875d26cb8d48f14a3d3174cbd2e38deaa252135", - "S": "0x3cb9019472a5b4bb332f0d02a500479b488333e6c222bc7525bd9d7c11090fd1", - "V": 28 - }, - { - "Account": "0x3EAE2142B96D481DD0C28079fA4F298eC8e8d9D7", - "Index": 39, - "Proof": [ - "0xc2b1922c43b1182063b0262920c5d9a7b85839d5fd11f19e630257f2187afa30", - "0x84af222c7e6c0ffce1d548800ff67fffea86bd25293ed83c7b90be7be789b975", - "0x8d9e697b246bbdee48bf6294c139bcd8bd2e70703761f0901ac9c488fc7d6fde", - "0x244d01eef112f4ee84d9b5ec500710e303aacaa628c11d67f585556ddd24d3aa", - "0xdf6b1d6bc153f1ec2ee4d92c9b95ad36d364926aac3fd0d1e27e42afd4c3b31d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x2904a159bb4fb0c6092f633f81574253f2da6f4b0b51eaccb76cb25444464893", - "S": "0x1b36fca0a827136b381aa64e67a77a886e70619ae6fcdc1cd2aeb7f51a602e72", - "V": 28 - }, - { - "Account": "0x26EEdB3498Aa06409b38920204665fa531d6A1Da", - "Index": 44, - "Proof": [ - "0x74ba2fd2bb2edc3f976893449acf6a73bdb246065c24379413e6fe65bf493ab0", - "0x725a1fac2f169fa88f288a85e771979046a2ec19516ec717b37188e7ec836d03", - "0x49d3ecfd1a79bc58da07828306b4100c4d08a4f69ad344129cc9c0a232dac003", - "0xefe7bdecae853c1eb410112b050e10266693bb0070f81b788234e838f2235206", - "0xdf6b1d6bc153f1ec2ee4d92c9b95ad36d364926aac3fd0d1e27e42afd4c3b31d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xe0bec696ceeff47224518279a3f332de230f5c3b701daf05241759be366d718a", - "S": "0x547c4ef8a1d24b9e0707e61fd01f44ad8faa9b72751e14221301b8b906173d14", - "V": 28 - }, - { - "Account": "0xF06ADA503B607829b782D12381Db56B71c7Eb06B", - "Index": 54, - "Proof": [ - "0x55abdf930b18ba4e044c34cfd6a97373a0bd74e2e937a70b6f560df62001676c", - "0x95933a067133017a4da960991db22cbbafded695161658ad3d7b5ba5ee41aed1", - "0x137fa243108ac923310df21559fb00965b94d7093d24e89642ce88499d6534a8", - "0xa6a22f26d93a17398ededd25e42f78062324f5021b7ad58db1acd75d15ce0cac", - "0xc651b81a299c88a02cb667d01c789f3e09e6778d6bb6e1dc53f6f4b6f81fe71d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x11ad882c8a7566601d9080fc73f7e9aacd771a8aff9343bfd2c91ae299aecc6d", - "S": "0x22de0928320ab6b0ab0fb6a0000bee8e879bb67a82e572b038ba81444ac408f6", - "V": 28 - }, - { - "Account": "0x49EdA650eF37A9b74fEc2C418d10A3f4cE256529", - "Index": 57, - "Proof": [ - "0x3eb799651607280e854bd2e42c1df1c8e4a6167772dfb3c64a813e40f6e87136", - "0x4758d15229e15bca9edcbf46ba078ecf79c9f035a2a13cff1b3b3ede898d491d", - "0xa7e38b63e8bf319e6a2f442c511cc2957f61935b42f52ae7363b352b7b075d1e", - "0x359dd5455a556b49db4862bbc7476dc4bec8a706128ef7651012008bdc651219", - "0xc651b81a299c88a02cb667d01c789f3e09e6778d6bb6e1dc53f6f4b6f81fe71d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xd5cbbf7866a858ac827153f0c6fcbe957c1655b4fac96349957af22ff3a1495b", - "S": "0x6a70cfb0d3f61a022d920b8040c7b01bd3d38382989e2f995bed0e76e9cb9ca2", - "V": 28 - }, - { - "Account": "0x27347a969d7dbbfB064178e31B059E762F906d25", - "Index": 58, - "Proof": [ - "0xa2e2d3b7080ad86545378ff6749c5e9921746925faa09c37fbcc540c98ab677d", - "0x2b07e589c159807aafdf6a221c7a1f0ace050f17d86ce3a95976d5ca87be2c00", - "0xa7e38b63e8bf319e6a2f442c511cc2957f61935b42f52ae7363b352b7b075d1e", - "0x359dd5455a556b49db4862bbc7476dc4bec8a706128ef7651012008bdc651219", - "0xc651b81a299c88a02cb667d01c789f3e09e6778d6bb6e1dc53f6f4b6f81fe71d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0xdb5d3ecd0f393e59a07c5e017485b2fd5372dbd97c5ff7d80a49a76063f3cd37", - "S": "0x29e413287101f8af4fe8e4d5cafab5d89578bc2b4a8fb3f494fb78cdf469f540", - "V": 28 - }, - { - "Account": "0xfCc92702da79Ae266bD978E4420b64F821CbBed0", - "Index": 61, - "Proof": [ - "0xc2a5f348332832b8a56d56536548286102c9d25dae88b251521c79d15edf5762", - "0xff488e61ca40f4c771037d81b3e985d974956c68fc9233b757bda5c1a85960e8", - "0x3812b047c408c6851d72359296628e685286f33cccf454fbbb9ce44fa3184e32", - "0x359dd5455a556b49db4862bbc7476dc4bec8a706128ef7651012008bdc651219", - "0xc651b81a299c88a02cb667d01c789f3e09e6778d6bb6e1dc53f6f4b6f81fe71d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x7adfd7b751dd93329ea01637e153a5a660227c465b78354c963173522d22e811", - "S": "0x0b737e637d381a78f008d89b9f7a48d908c572dfd1af591134d3db883a876b10", - "V": 27 - }, - { - "Account": "0x9336C7Ab605F2B12D686A45D483fc7bFdE0F7375", - "Index": 63, - "Proof": [ - "0xc7b7547c30a4e1d78ebd7b48974864827597f77b5c2b556fe8d16b0e987830cc", - "0xfa66fd2e2168c2d0dcf378bf94c12fd7fb1abf260a1cdebdad2e4dcbfc07277b", - "0x3812b047c408c6851d72359296628e685286f33cccf454fbbb9ce44fa3184e32", - "0x359dd5455a556b49db4862bbc7476dc4bec8a706128ef7651012008bdc651219", - "0xc651b81a299c88a02cb667d01c789f3e09e6778d6bb6e1dc53f6f4b6f81fe71d", - "0x2326df01d2c30df1b52ae9c14c93c80296f5b349e38ba0257662968295e71c75", - "0x650be5cdac80ed9ceeb7d97047c114fd4d87217fe5e37271b48f6cbe9d9ded22" - ], - "R": "0x6e59afc52b7ff1804ea060eb60d8ad468e0701fc216627f4388153dd6eb66d0b", - "S": "0x5b2a6109ff08c51cf1581f772f67b1c9b71aeea277038617fa4869fc5f19ffa0", - "V": 28 - }, - { - "Account": "0xD6848af9009D205eb061f91d180a0f73667d3E77", - "Index": 65, - "Proof": [ - "0xf0e1cd4a27bc7b64ab21bf6e9d8d3cf63d694a9ebbf6fb64d555e1e5066e7210", - "0xb85622ba5b06b1c7029e42f889b6194faad992974e0192274810d18e2b69946b", - "0x44c0d4ca674e976f1277b4e23abc89bfc2108663c503cf678ed420b32e793b9a", - "0x7b789b6ffe16833a3103fa6acb10a2d5349e9f5f839afa3d0a1a12cbe8077c1e", - "0xc21b23d638a977ef4c92bf61279851468bc1b0ede45590a6d07bf7c546aff0c4" - ], - "R": "0x67269d58b126f84149c19c237c9f789f54fb4f36e8229f8dbfff9cd587f3baca", - "S": "0x6375388983d9179ebb4b64c64fa94fd371a22549c6a6e4b24feff593571c924f", - "V": 28 - }, - { - "Account": "0x20DFF600cb453644B3C004e26384bc683a58790a", - "Index": 67, - "Proof": [ - "0xa1796360ce3f91d5db1c59d4745e7021d82ae3372d7f49faa25446b545c1686f", - "0xa9eda854f3d65348fb68e0da46cf4f678c83fe8eebffce6e7a7ea0cf7435999d", - "0x44c0d4ca674e976f1277b4e23abc89bfc2108663c503cf678ed420b32e793b9a", - "0x7b789b6ffe16833a3103fa6acb10a2d5349e9f5f839afa3d0a1a12cbe8077c1e", - "0xc21b23d638a977ef4c92bf61279851468bc1b0ede45590a6d07bf7c546aff0c4" - ], - "R": "0x5021f378dc793ec2873d39c0300138a443feddfbb2992beda19060cbafebce5d", - "S": "0x75f0ef01f34a30f9a910e2d65fa6685c5c1578d2e46f3047aecba357cfe5601d", - "V": 28 - } - ] - }, - "txHash": "0x71a53fee53ca72f579e1278ca2fc66563311b12f6afc4771a004ec32a735cca5" -} diff --git a/overridden_contracts/test/data/beefy-final-bitfield-0.json b/overridden_contracts/test/data/beefy-final-bitfield-0.json deleted file mode 100644 index 615c56b..0000000 --- a/overridden_contracts/test/data/beefy-final-bitfield-0.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "final": { - "finalBitField": [ - 1190034073145691624194 - ], - "finalBitFieldRaw": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000040830a54748c2c5302" - } -} \ No newline at end of file diff --git a/overridden_contracts/test/data/beefy-final-bitfield-3.json b/overridden_contracts/test/data/beefy-final-bitfield-3.json deleted file mode 100644 index dbda30e..0000000 --- a/overridden_contracts/test/data/beefy-final-bitfield-3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "final": { - "finalBitField": [ - 1263821049445395223298 - ], - "finalBitFieldRaw": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000044830a5475ae2c5302" - } -} \ No newline at end of file diff --git a/overridden_contracts/test/data/beefy-final-proof-0.json b/overridden_contracts/test/data/beefy-final-proof-0.json deleted file mode 100644 index 3d7eaa6..0000000 --- a/overridden_contracts/test/data/beefy-final-proof-0.json +++ /dev/null @@ -1,1971 +0,0 @@ -{ - "finalValidatorsProof": [ - { - "v": 28, - "r": { - "0": 209, - "1": 83, - "2": 122, - "3": 205, - "4": 199, - "5": 122, - "6": 6, - "7": 9, - "8": 18, - "9": 206, - "10": 213, - "11": 255, - "12": 248, - "13": 146, - "14": 176, - "15": 242, - "16": 214, - "17": 151, - "18": 133, - "19": 200, - "20": 148, - "21": 202, - "22": 8, - "23": 172, - "24": 131, - "25": 1, - "26": 235, - "27": 32, - "28": 66, - "29": 205, - "30": 105, - "31": 72 - }, - "s": { - "0": 49, - "1": 205, - "2": 249, - "3": 104, - "4": 151, - "5": 221, - "6": 72, - "7": 237, - "8": 102, - "9": 30, - "10": 204, - "11": 118, - "12": 151, - "13": 151, - "14": 22, - "15": 242, - "16": 146, - "17": 9, - "18": 38, - "19": 51, - "20": 135, - "21": 48, - "22": 253, - "23": 149, - "24": 111, - "25": 106, - "26": 190, - "27": 159, - "28": 236, - "29": 27, - "30": 158, - "31": 32 - }, - "index": 1, - "account": "0x55E18e8C6Ed1b12F220826e0279B60985DE0F2b7", - "proof": [ - "0x9f638d4795a7a68d02dda9c7029e9fa392658bdd9c2ec6670298d73c95ce6e97", - "0x0ddae405dc19ebec4a340811f1eaa8d1e2fde2902722839c252c46622c230dd9", - "0xecca7e49c86e7184782e17c6414f3725d72dd49cf8f074b0080b65dbffb708bb", - "0xa6d711e88370aadeeefc420a6f2c5dc4dd87a885f70d3c9ca65768ade41c483a", - "0x2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b747311", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 137, - "1": 204, - "2": 4, - "3": 44, - "4": 72, - "5": 209, - "6": 242, - "7": 24, - "8": 9, - "9": 79, - "10": 207, - "11": 18, - "12": 139, - "13": 76, - "14": 128, - "15": 195, - "16": 232, - "17": 76, - "18": 141, - "19": 151, - "20": 241, - "21": 67, - "22": 6, - "23": 123, - "24": 148, - "25": 251, - "26": 48, - "27": 119, - "28": 122, - "29": 182, - "30": 22, - "31": 176 - }, - "s": { - "0": 122, - "1": 36, - "2": 156, - "3": 45, - "4": 149, - "5": 151, - "6": 42, - "7": 189, - "8": 240, - "9": 162, - "10": 177, - "11": 75, - "12": 75, - "13": 107, - "14": 196, - "15": 219, - "16": 198, - "17": 158, - "18": 229, - "19": 62, - "20": 165, - "21": 248, - "22": 99, - "23": 95, - "24": 204, - "25": 1, - "26": 45, - "27": 99, - "28": 240, - "29": 57, - "30": 51, - "31": 154 - }, - "index": 8, - "account": "0xbA6705c26ee930eFF285283939e588f574b7EDA4", - "proof": [ - "0xfd869da58bcdcc433436cb281fbdb10e6ab48bc4d0f45eaf2f81cdccfaa621cf", - "0x42d9ed32d1eafb57bda9732004ada71bebad93f8b86988d3d21e42589f89c661", - "0x8970c381942a5e0bb57b7b254d06ccb5627f6f062252711b52a16245c640830b", - "0xaf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed4", - "0x2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b747311", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 112, - "1": 174, - "2": 86, - "3": 213, - "4": 208, - "5": 239, - "6": 96, - "7": 218, - "8": 224, - "9": 207, - "10": 7, - "11": 33, - "12": 214, - "13": 46, - "14": 171, - "15": 221, - "16": 174, - "17": 17, - "18": 236, - "19": 211, - "20": 40, - "21": 27, - "22": 57, - "23": 127, - "24": 175, - "25": 225, - "26": 247, - "27": 49, - "28": 75, - "29": 130, - "30": 219, - "31": 121 - }, - "s": { - "0": 54, - "1": 145, - "2": 225, - "3": 67, - "4": 140, - "5": 103, - "6": 248, - "7": 103, - "8": 147, - "9": 142, - "10": 244, - "11": 76, - "12": 27, - "13": 69, - "14": 214, - "15": 193, - "16": 138, - "17": 157, - "18": 8, - "19": 249, - "20": 55, - "21": 19, - "22": 74, - "23": 221, - "24": 81, - "25": 200, - "26": 62, - "27": 14, - "28": 6, - "29": 0, - "30": 70, - "31": 121 - }, - "index": 9, - "account": "0x4c88d475766E01fe7dB288E8949E8fbAec90b523", - "proof": [ - "0xf2e5b9bec3c1f02022e7d8170ee87089057e17d02b4640671fc3f70c0c3bf6e8", - "0x42d9ed32d1eafb57bda9732004ada71bebad93f8b86988d3d21e42589f89c661", - "0x8970c381942a5e0bb57b7b254d06ccb5627f6f062252711b52a16245c640830b", - "0xaf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed4", - "0x2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b747311", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 220, - "1": 107, - "2": 105, - "3": 69, - "4": 135, - "5": 111, - "6": 107, - "7": 63, - "8": 31, - "9": 187, - "10": 162, - "11": 138, - "12": 197, - "13": 234, - "14": 193, - "15": 147, - "16": 4, - "17": 105, - "18": 24, - "19": 144, - "20": 106, - "21": 32, - "22": 152, - "23": 238, - "24": 36, - "25": 3, - "26": 185, - "27": 156, - "28": 241, - "29": 8, - "30": 238, - "31": 136 - }, - "s": { - "0": 48, - "1": 164, - "2": 102, - "3": 95, - "4": 133, - "5": 57, - "6": 143, - "7": 159, - "8": 16, - "9": 18, - "10": 99, - "11": 123, - "12": 138, - "13": 232, - "14": 252, - "15": 2, - "16": 11, - "17": 170, - "18": 15, - "19": 148, - "20": 59, - "21": 188, - "22": 200, - "23": 13, - "24": 165, - "25": 18, - "26": 39, - "27": 156, - "28": 119, - "29": 207, - "30": 76, - "31": 14 - }, - "index": 12, - "account": "0xcEA94bb26f6A706248f372EaB9C5e932a8bf4617", - "proof": [ - "0x1bb4f435c3b4b89bdfba70c5793028dc3d51c70fc44ea5ac42b7bf30c7a1c12b", - "0x10a6a04620439420509dd181df6aeb01ec222e93ab257afd7e6ae8dd82540f11", - "0x16e976b460155c4453c0c60e9f1a4f47ef620beb3882a9aed4af6564d99076d0", - "0xaf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed4", - "0x2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b747311", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 193, - "1": 194, - "2": 2, - "3": 8, - "4": 18, - "5": 208, - "6": 36, - "7": 231, - "8": 206, - "9": 30, - "10": 182, - "11": 158, - "12": 17, - "13": 128, - "14": 222, - "15": 157, - "16": 246, - "17": 149, - "18": 221, - "19": 14, - "20": 255, - "21": 46, - "22": 109, - "23": 60, - "24": 52, - "25": 228, - "26": 32, - "27": 88, - "28": 100, - "29": 237, - "30": 84, - "31": 254 - }, - "s": { - "0": 3, - "1": 169, - "2": 185, - "3": 80, - "4": 47, - "5": 10, - "6": 236, - "7": 17, - "8": 76, - "9": 98, - "10": 142, - "11": 92, - "12": 162, - "13": 255, - "14": 135, - "15": 220, - "16": 151, - "17": 68, - "18": 39, - "19": 95, - "20": 153, - "21": 243, - "22": 108, - "23": 160, - "24": 220, - "25": 142, - "26": 21, - "27": 184, - "28": 127, - "29": 77, - "30": 85, - "31": 70 - }, - "index": 14, - "account": "0xba347abDD8fc2Fa86227a0249C0baC0Eac5DbFFd", - "proof": [ - "0x02554d891e5d1d29838dd67f120dc601d2a9af5db3aa46d4f0597df94ce15017", - "0xf33e999f73f666fbb0521c18262c9cb12b17dc7336acc35ffcd539799217e313", - "0x16e976b460155c4453c0c60e9f1a4f47ef620beb3882a9aed4af6564d99076d0", - "0xaf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed4", - "0x2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b747311", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 95, - "1": 165, - "2": 138, - "3": 160, - "4": 60, - "5": 169, - "6": 196, - "7": 23, - "8": 36, - "9": 116, - "10": 30, - "11": 209, - "12": 28, - "13": 249, - "14": 22, - "15": 66, - "16": 103, - "17": 245, - "18": 225, - "19": 71, - "20": 96, - "21": 55, - "22": 108, - "23": 241, - "24": 180, - "25": 176, - "26": 65, - "27": 54, - "28": 55, - "29": 129, - "30": 68, - "31": 56 - }, - "s": { - "0": 69, - "1": 207, - "2": 152, - "3": 240, - "4": 194, - "5": 16, - "6": 219, - "7": 197, - "8": 100, - "9": 103, - "10": 51, - "11": 44, - "12": 98, - "13": 164, - "14": 133, - "15": 151, - "16": 7, - "17": 240, - "18": 88, - "19": 170, - "20": 215, - "21": 43, - "22": 208, - "23": 89, - "24": 187, - "25": 94, - "26": 124, - "27": 23, - "28": 246, - "29": 249, - "30": 34, - "31": 46 - }, - "index": 18, - "account": "0x7bD970810445290Ef6B0d05C7f3e0f801cDAD8a9", - "proof": [ - "0x718c9b5ce50b808883dc04947b051e3bef2ef0425dc132debbac5bb8d6087f44", - "0xb11ccc23573a5958843aa903d1d0188ea7fc5f6bcf27e8c84eaebefb70f54366", - "0x5e4e72c113a324ef77787fd287e646b2e0ad5ab9ae80979db0e3095edbbc5d5e", - "0xca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936e", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 29, - "1": 13, - "2": 199, - "3": 140, - "4": 21, - "5": 132, - "6": 62, - "7": 229, - "8": 107, - "9": 49, - "10": 69, - "11": 212, - "12": 167, - "13": 59, - "14": 63, - "15": 184, - "16": 146, - "17": 163, - "18": 29, - "19": 241, - "20": 128, - "21": 58, - "22": 249, - "23": 103, - "24": 190, - "25": 164, - "26": 188, - "27": 0, - "28": 83, - "29": 0, - "30": 154, - "31": 148 - }, - "s": { - "0": 96, - "1": 134, - "2": 77, - "3": 71, - "4": 167, - "5": 123, - "6": 72, - "7": 252, - "8": 36, - "9": 102, - "10": 65, - "11": 152, - "12": 190, - "13": 212, - "14": 51, - "15": 150, - "16": 163, - "17": 161, - "18": 79, - "19": 238, - "20": 57, - "21": 5, - "22": 75, - "23": 239, - "24": 66, - "25": 218, - "26": 8, - "27": 1, - "28": 50, - "29": 213, - "30": 88, - "31": 42 - }, - "index": 19, - "account": "0xe89F1D28601bbe5E99A0db247b6d3B35Fb02f9C5", - "proof": [ - "0x5ba8ed0f8785e5666b7c442021ce7983f00921920d8478d55ed1e1c2e2425ebc", - "0xb11ccc23573a5958843aa903d1d0188ea7fc5f6bcf27e8c84eaebefb70f54366", - "0x5e4e72c113a324ef77787fd287e646b2e0ad5ab9ae80979db0e3095edbbc5d5e", - "0xca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936e", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 149, - "1": 147, - "2": 194, - "3": 228, - "4": 153, - "5": 176, - "6": 250, - "7": 218, - "8": 71, - "9": 183, - "10": 56, - "11": 103, - "12": 117, - "13": 246, - "14": 204, - "15": 127, - "16": 182, - "17": 170, - "18": 228, - "19": 209, - "20": 124, - "21": 79, - "22": 84, - "23": 11, - "24": 166, - "25": 208, - "26": 226, - "27": 75, - "28": 11, - "29": 137, - "30": 229, - "31": 65 - }, - "s": { - "0": 124, - "1": 10, - "2": 62, - "3": 242, - "4": 184, - "5": 120, - "6": 152, - "7": 44, - "8": 26, - "9": 36, - "10": 87, - "11": 31, - "12": 100, - "13": 222, - "14": 45, - "15": 249, - "16": 46, - "17": 75, - "18": 100, - "19": 255, - "20": 232, - "21": 54, - "22": 142, - "23": 215, - "24": 36, - "25": 45, - "26": 245, - "27": 151, - "28": 239, - "29": 36, - "30": 122, - "31": 53 - }, - "index": 21, - "account": "0x638a0850DAffe6358aA80b8aE98Ad0EC25061D4B", - "proof": [ - "0x1c8e06d7b1687ffe2abba0cffcae8b39a0ec9a6a1f0f05992dfc06b756a4d771", - "0xbbd75e40a5be8a6d964cb21e7d93a51af457266721ba0d82e446f32a255119ed", - "0xb870df94a423e3dfabd590045ba955d86795c8b5795d6388b898e3cbde24bdb6", - "0xca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936e", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 205, - "1": 10, - "2": 93, - "3": 58, - "4": 249, - "5": 101, - "6": 160, - "7": 79, - "8": 192, - "9": 214, - "10": 10, - "11": 195, - "12": 157, - "13": 139, - "14": 16, - "15": 4, - "16": 143, - "17": 42, - "18": 142, - "19": 8, - "20": 66, - "21": 166, - "22": 119, - "23": 64, - "24": 186, - "25": 145, - "26": 160, - "27": 106, - "28": 100, - "29": 21, - "30": 180, - "31": 245 - }, - "s": { - "0": 59, - "1": 191, - "2": 129, - "3": 232, - "4": 238, - "5": 217, - "6": 104, - "7": 16, - "8": 128, - "9": 35, - "10": 120, - "11": 114, - "12": 188, - "13": 143, - "14": 16, - "15": 76, - "16": 217, - "17": 63, - "18": 33, - "19": 137, - "20": 84, - "21": 156, - "22": 159, - "23": 152, - "24": 163, - "25": 253, - "26": 11, - "27": 180, - "28": 155, - "29": 87, - "30": 105, - "31": 155 - }, - "index": 26, - "account": "0xC122fA8524AE9897E0a0A788EFFA8Dc149Dd64d1", - "proof": [ - "0xf9705dd39c128105e60edee073f61a6709b14346aa654b4a5cb34388b66c1691", - "0x6ba91e46bd096f6e8b72c0fb921ec85fc08cd3fb2853a6579cb0130190328c50", - "0x061bad1f99006db82b8189a8d4bcc96d6c3667336ba181acad98164ce6f114ed", - "0x325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 52, - "1": 58, - "2": 161, - "3": 143, - "4": 158, - "5": 29, - "6": 208, - "7": 148, - "8": 249, - "9": 80, - "10": 248, - "11": 61, - "12": 252, - "13": 212, - "14": 28, - "15": 243, - "16": 154, - "17": 53, - "18": 89, - "19": 106, - "20": 140, - "21": 238, - "22": 243, - "23": 74, - "24": 56, - "25": 122, - "26": 132, - "27": 18, - "28": 111, - "29": 84, - "30": 61, - "31": 115 - }, - "s": { - "0": 107, - "1": 181, - "2": 33, - "3": 138, - "4": 202, - "5": 210, - "6": 24, - "7": 150, - "8": 183, - "9": 141, - "10": 199, - "11": 201, - "12": 72, - "13": 58, - "14": 75, - "15": 49, - "16": 202, - "17": 78, - "18": 24, - "19": 49, - "20": 52, - "21": 121, - "22": 99, - "23": 56, - "24": 46, - "25": 15, - "26": 60, - "27": 232, - "28": 45, - "29": 115, - "30": 91, - "31": 197 - }, - "index": 27, - "account": "0xF9bF1ADE364193268c3fD151E3E68796249c912E", - "proof": [ - "0xa7cb4572bf2962bb133980eb844b4997f8c098f09d9672e0af8e33777a0ef092", - "0x6ba91e46bd096f6e8b72c0fb921ec85fc08cd3fb2853a6579cb0130190328c50", - "0x061bad1f99006db82b8189a8d4bcc96d6c3667336ba181acad98164ce6f114ed", - "0x325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 68, - "1": 191, - "2": 237, - "3": 250, - "4": 74, - "5": 246, - "6": 198, - "7": 49, - "8": 136, - "9": 215, - "10": 233, - "11": 26, - "12": 76, - "13": 166, - "14": 216, - "15": 120, - "16": 234, - "17": 255, - "18": 174, - "19": 72, - "20": 147, - "21": 48, - "22": 3, - "23": 15, - "24": 198, - "25": 91, - "26": 236, - "27": 23, - "28": 173, - "29": 5, - "30": 16, - "31": 201 - }, - "s": { - "0": 21, - "1": 76, - "2": 20, - "3": 67, - "4": 89, - "5": 175, - "6": 44, - "7": 74, - "8": 228, - "9": 169, - "10": 5, - "11": 38, - "12": 2, - "13": 199, - "14": 169, - "15": 220, - "16": 135, - "17": 171, - "18": 147, - "19": 123, - "20": 181, - "21": 229, - "22": 186, - "23": 80, - "24": 178, - "25": 113, - "26": 3, - "27": 229, - "28": 231, - "29": 141, - "30": 21, - "31": 215 - }, - "index": 31, - "account": "0x5473090d3a9D7B984B31f2d36f2d004a9188796d", - "proof": [ - "0x2d3fe5fcf7e9b1559b73b0055d813911a135fd0f7311e5a69899cf420c418c9f", - "0x8df6a7abbefe9b2fe4e384876b71ec1eb90d23950c68b78df4e22909590d1930", - "0x7126a8044f997db28aaf469f8f66a8a4c09c25ab03c0b902bf02618d54d5e86e", - "0x325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 131, - "1": 203, - "2": 150, - "3": 171, - "4": 61, - "5": 11, - "6": 19, - "7": 82, - "8": 57, - "9": 146, - "10": 176, - "11": 80, - "12": 170, - "13": 186, - "14": 214, - "15": 198, - "16": 38, - "17": 168, - "18": 52, - "19": 58, - "20": 240, - "21": 211, - "22": 238, - "23": 231, - "24": 43, - "25": 125, - "26": 107, - "27": 48, - "28": 179, - "29": 155, - "30": 97, - "31": 145 - }, - "s": { - "0": 48, - "1": 47, - "2": 43, - "3": 77, - "4": 243, - "5": 149, - "6": 18, - "7": 11, - "8": 109, - "9": 66, - "10": 207, - "11": 125, - "12": 155, - "13": 147, - "14": 2, - "15": 99, - "16": 2, - "17": 183, - "18": 114, - "19": 11, - "20": 153, - "21": 44, - "22": 73, - "23": 116, - "24": 44, - "25": 47, - "26": 88, - "27": 203, - "28": 112, - "29": 163, - "30": 223, - "31": 72 - }, - "index": 34, - "account": "0x0bfC283B4769560580eCc8e1AC10746b3BD9ACA4", - "proof": [ - "0xcbd43c389a6eff6fac6d5d3d24807e3bb10cdcb6b09d4b53268414d3b8974e9a", - "0xa2db25aa7057e89d4f0e866cbdd150b76f94e4de7669320568f538a98c84388d", - "0x8ef3bfbae8f9b410d233cdfe5d7e21a5efa8b14e8101924058008818e14b6079", - "0x9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 100, - "1": 147, - "2": 211, - "3": 148, - "4": 11, - "5": 94, - "6": 129, - "7": 62, - "8": 135, - "9": 236, - "10": 62, - "11": 61, - "12": 17, - "13": 61, - "14": 239, - "15": 25, - "16": 189, - "17": 253, - "18": 44, - "19": 95, - "20": 25, - "21": 244, - "22": 155, - "23": 87, - "24": 133, - "25": 203, - "26": 252, - "27": 118, - "28": 134, - "29": 6, - "30": 123, - "31": 109 - }, - "s": { - "0": 113, - "1": 131, - "2": 127, - "3": 124, - "4": 148, - "5": 252, - "6": 59, - "7": 182, - "8": 136, - "9": 177, - "10": 204, - "11": 90, - "12": 113, - "13": 199, - "14": 118, - "15": 19, - "16": 68, - "17": 220, - "18": 79, - "19": 128, - "20": 218, - "21": 53, - "22": 21, - "23": 206, - "24": 6, - "25": 160, - "26": 205, - "27": 203, - "28": 104, - "29": 58, - "30": 3, - "31": 68 - }, - "index": 36, - "account": "0x8713FfeC5c23955193bDBAa94c43E43091673B5f", - "proof": [ - "0x96bb7448b75bc9288b782a3a15ed3a7e04be7232693dbadfa1c4b58b6f6fe312", - "0x2d473663ea72fa4448c4f0ac34ca65f2786dddea9e86e3986d3ef6744a99d25b", - "0xaa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc", - "0x9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 237, - "1": 191, - "2": 19, - "3": 21, - "4": 81, - "5": 184, - "6": 1, - "7": 25, - "8": 167, - "9": 199, - "10": 8, - "11": 68, - "12": 223, - "13": 74, - "14": 21, - "15": 135, - "16": 55, - "17": 61, - "18": 155, - "19": 239, - "20": 83, - "21": 17, - "22": 29, - "23": 52, - "24": 114, - "25": 7, - "26": 123, - "27": 196, - "28": 220, - "29": 210, - "30": 15, - "31": 80 - }, - "s": { - "0": 88, - "1": 195, - "2": 216, - "3": 92, - "4": 133, - "5": 176, - "6": 138, - "7": 237, - "8": 187, - "9": 106, - "10": 240, - "11": 159, - "12": 67, - "13": 9, - "14": 129, - "15": 162, - "16": 227, - "17": 199, - "18": 224, - "19": 202, - "20": 177, - "21": 219, - "22": 213, - "23": 36, - "24": 110, - "25": 166, - "26": 23, - "27": 167, - "28": 145, - "29": 178, - "30": 202, - "31": 220 - }, - "index": 37, - "account": "0x8efB8e804f959f723a26ae7e1f2d6a55f2Bf4b01", - "proof": [ - "0x2b720bc8c7bd65302d3a9b6ed95709a5bdfffaa89f12a1b5d43905289c7d413f", - "0x2d473663ea72fa4448c4f0ac34ca65f2786dddea9e86e3986d3ef6744a99d25b", - "0xaa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc", - "0x9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 255, - "1": 68, - "2": 201, - "3": 96, - "4": 151, - "5": 247, - "6": 202, - "7": 80, - "8": 10, - "9": 216, - "10": 134, - "11": 217, - "12": 15, - "13": 247, - "14": 138, - "15": 96, - "16": 170, - "17": 55, - "18": 82, - "19": 173, - "20": 129, - "21": 61, - "22": 176, - "23": 131, - "24": 4, - "25": 60, - "26": 84, - "27": 206, - "28": 10, - "29": 181, - "30": 62, - "31": 55 - }, - "s": { - "0": 51, - "1": 103, - "2": 162, - "3": 152, - "4": 53, - "5": 156, - "6": 55, - "7": 223, - "8": 64, - "9": 134, - "10": 131, - "11": 71, - "12": 82, - "13": 154, - "14": 237, - "15": 79, - "16": 146, - "17": 0, - "18": 131, - "19": 66, - "20": 156, - "21": 222, - "22": 114, - "23": 203, - "24": 202, - "25": 176, - "26": 82, - "27": 252, - "28": 237, - "29": 167, - "30": 107, - "31": 124 - }, - "index": 38, - "account": "0x6F57c6389c53cE81a689270533c4B44258FEaC73", - "proof": [ - "0xcc2df11e3c69dffcc8187127a3b334432dc29635d2e5243aa5f8814a49dfb233", - "0x9f28aef3ff250b849a119017971362e72cc6a981641230be766c00927bec6362", - "0xaa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc", - "0x9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 28, - "1": 115, - "2": 106, - "3": 186, - "4": 54, - "5": 108, - "6": 73, - "7": 94, - "8": 248, - "9": 144, - "10": 248, - "11": 94, - "12": 122, - "13": 200, - "14": 68, - "15": 175, - "16": 10, - "17": 160, - "18": 88, - "19": 150, - "20": 173, - "21": 80, - "22": 218, - "23": 248, - "24": 3, - "25": 213, - "26": 19, - "27": 178, - "28": 113, - "29": 213, - "30": 246, - "31": 167 - }, - "s": { - "0": 17, - "1": 174, - "2": 6, - "3": 87, - "4": 49, - "5": 58, - "6": 96, - "7": 115, - "8": 205, - "9": 100, - "10": 151, - "11": 86, - "12": 12, - "13": 140, - "14": 148, - "15": 8, - "16": 61, - "17": 241, - "18": 105, - "19": 232, - "20": 78, - "21": 37, - "22": 81, - "23": 134, - "24": 15, - "25": 237, - "26": 234, - "27": 13, - "28": 99, - "29": 167, - "30": 155, - "31": 150 - }, - "index": 42, - "account": "0x6742544686e53F20aF2C142CC16237a00c73dE8a", - "proof": [ - "0xca98d350b190c5eccb37aa15728b19144c9759d396285a4e7f2a28c7809c8eba", - "0xde649342947e1988655c618763d70685a13df42aa865cf359589548bc23a2a3e", - "0xdf87aa78616553aa20706bacdbbdd36e1144798c2856e10cdd4499faa7736c82", - "0x1c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 249, - "1": 59, - "2": 50, - "3": 167, - "4": 218, - "5": 56, - "6": 190, - "7": 3, - "8": 230, - "9": 204, - "10": 58, - "11": 100, - "12": 88, - "13": 201, - "14": 132, - "15": 6, - "16": 128, - "17": 115, - "18": 143, - "19": 49, - "20": 137, - "21": 71, - "22": 191, - "23": 121, - "24": 148, - "25": 117, - "26": 66, - "27": 196, - "28": 100, - "29": 209, - "30": 147, - "31": 154 - }, - "s": { - "0": 102, - "1": 225, - "2": 241, - "3": 58, - "4": 248, - "5": 60, - "6": 2, - "7": 204, - "8": 116, - "9": 25, - "10": 148, - "11": 217, - "12": 75, - "13": 246, - "14": 246, - "15": 158, - "16": 112, - "17": 235, - "18": 230, - "19": 165, - "20": 86, - "21": 230, - "22": 42, - "23": 6, - "24": 136, - "25": 206, - "26": 15, - "27": 63, - "28": 183, - "29": 158, - "30": 107, - "31": 66 - }, - "index": 44, - "account": "0x1816545f1Ec96A0Dc86f507A269aF7663d2982ac", - "proof": [ - "0x520952d6f00e3741a5575c0f7f2090cd719216dbb3ced9d5c21c24dbce285798", - "0xf40fe0fd52f06a2d6094f3decbbeb75424bf1ae7cb1e749f2950a0af77aa1dc5", - "0x3353786e8802d17d7b68581269cc7c782705a4fdb918a4a2973bfc4e7ec9e0a7", - "0x1c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 77, - "1": 65, - "2": 213, - "3": 218, - "4": 240, - "5": 214, - "6": 222, - "7": 242, - "8": 230, - "9": 243, - "10": 156, - "11": 231, - "12": 243, - "13": 157, - "14": 38, - "15": 130, - "16": 128, - "17": 223, - "18": 216, - "19": 9, - "20": 71, - "21": 4, - "22": 81, - "23": 219, - "24": 10, - "25": 161, - "26": 240, - "27": 110, - "28": 71, - "29": 206, - "30": 209, - "31": 66 - }, - "s": { - "0": 95, - "1": 70, - "2": 94, - "3": 153, - "4": 138, - "5": 81, - "6": 45, - "7": 227, - "8": 217, - "9": 172, - "10": 110, - "11": 207, - "12": 93, - "13": 157, - "14": 32, - "15": 58, - "16": 23, - "17": 125, - "18": 57, - "19": 174, - "20": 166, - "21": 15, - "22": 203, - "23": 87, - "24": 218, - "25": 12, - "26": 78, - "27": 19, - "28": 115, - "29": 224, - "30": 160, - "31": 143 - }, - "index": 46, - "account": "0x0A34E066bA08F8fD62395FaEa13A324795936423", - "proof": [ - "0x2dc32d91b583f563e8cc5fc3955eb9dacbca98a92a26765ca9e7e89540275957", - "0x84ac7649882c9a452a02c49e4514ca792334eec158702060122e54f7853e0a35", - "0x3353786e8802d17d7b68581269cc7c782705a4fdb918a4a2973bfc4e7ec9e0a7", - "0x1c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 132, - "1": 206, - "2": 204, - "3": 97, - "4": 23, - "5": 249, - "6": 159, - "7": 112, - "8": 197, - "9": 20, - "10": 107, - "11": 225, - "12": 99, - "13": 90, - "14": 202, - "15": 115, - "16": 129, - "17": 194, - "18": 24, - "19": 241, - "20": 123, - "21": 40, - "22": 32, - "23": 5, - "24": 113, - "25": 17, - "26": 14, - "27": 235, - "28": 5, - "29": 31, - "30": 134, - "31": 206 - }, - "s": { - "0": 108, - "1": 206, - "2": 171, - "3": 8, - "4": 196, - "5": 223, - "6": 229, - "7": 241, - "8": 65, - "9": 146, - "10": 148, - "11": 10, - "12": 219, - "13": 106, - "14": 78, - "15": 84, - "16": 243, - "17": 114, - "18": 141, - "19": 133, - "20": 163, - "21": 20, - "22": 191, - "23": 248, - "24": 248, - "25": 184, - "26": 134, - "27": 147, - "28": 39, - "29": 50, - "30": 159, - "31": 120 - }, - "index": 49, - "account": "0xe1b54fe1Ce501B582C4E9BB0DF1637730fB7AF91", - "proof": [ - "0xcdbcffc7df03d81faa7348cc74f9ee6d67f4ec8275c20b9b225ac1ee04e80d64", - "0xc1bfe7aae1ec8d84327846f6acfa72c4133d33d5eb410d8ec99b9f35fd393988", - "0x1f613d9f7e71d7dc4c307193b8d42896328a73e053cfe6a6e4cc786c10e43296", - "0xa27b84005396060df67c11bed4504cdb87cf1ea758f6f4a140cb29494a087a4f", - "0xbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 61, - "1": 171, - "2": 234, - "3": 182, - "4": 190, - "5": 182, - "6": 61, - "7": 147, - "8": 215, - "9": 118, - "10": 8, - "11": 10, - "12": 52, - "13": 55, - "14": 246, - "15": 0, - "16": 63, - "17": 234, - "18": 123, - "19": 45, - "20": 42, - "21": 204, - "22": 252, - "23": 211, - "24": 59, - "25": 240, - "26": 25, - "27": 100, - "28": 140, - "29": 37, - "30": 235, - "31": 32 - }, - "s": { - "0": 37, - "1": 21, - "2": 145, - "3": 184, - "4": 205, - "5": 39, - "6": 193, - "7": 180, - "8": 45, - "9": 118, - "10": 183, - "11": 151, - "12": 117, - "13": 109, - "14": 150, - "15": 27, - "16": 154, - "17": 234, - "18": 15, - "19": 145, - "20": 116, - "21": 5, - "22": 248, - "23": 219, - "24": 87, - "25": 68, - "26": 250, - "27": 181, - "28": 216, - "29": 11, - "30": 73, - "31": 196 - }, - "index": 51, - "account": "0x2f1C6F5fCD931C27e1b2306852e21Aca92Fec6c5", - "proof": [ - "0x9dccf3e45bea61fa594ba6e5d230fcc2421a38989251fba2e8bbc874cb420e41", - "0x4886bae121d2ce619dfd57e50df1edbdae59ff35dd8c2eabe61d5a99bdf4cef4", - "0x1f613d9f7e71d7dc4c307193b8d42896328a73e053cfe6a6e4cc786c10e43296", - "0xa27b84005396060df67c11bed4504cdb87cf1ea758f6f4a140cb29494a087a4f", - "0xbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 213, - "1": 7, - "2": 152, - "3": 155, - "4": 129, - "5": 89, - "6": 32, - "7": 229, - "8": 140, - "9": 56, - "10": 103, - "11": 228, - "12": 214, - "13": 205, - "14": 150, - "15": 172, - "16": 49, - "17": 103, - "18": 58, - "19": 241, - "20": 207, - "21": 1, - "22": 157, - "23": 190, - "24": 183, - "25": 10, - "26": 56, - "27": 198, - "28": 237, - "29": 116, - "30": 30, - "31": 132 - }, - "s": { - "0": 43, - "1": 218, - "2": 87, - "3": 68, - "4": 194, - "5": 216, - "6": 158, - "7": 239, - "8": 179, - "9": 201, - "10": 17, - "11": 198, - "12": 94, - "13": 139, - "14": 161, - "15": 197, - "16": 31, - "17": 136, - "18": 183, - "19": 81, - "20": 63, - "21": 41, - "22": 74, - "23": 86, - "24": 163, - "25": 197, - "26": 68, - "27": 106, - "28": 144, - "29": 119, - "30": 225, - "31": 107 - }, - "index": 56, - "account": "0x3DAe00899E4f81E2B447b39a3CFF0eA4a8BC3273", - "proof": [ - "0x8c53e866a7ff52b8836810ea084a42336d638792ceca9ddb84429b690a9e0a0e", - "0xe7dd43698a3723e9471ba1b10e3da11e19653c87a12c4877b1ecc1b58bc99253", - "0x7b3707c9f2cd7dcf94982da6bc7804f76623dadb493a19af67eda93f05c37b7b", - "0x153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1", - "0xbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 123, - "1": 13, - "2": 21, - "3": 185, - "4": 196, - "5": 28, - "6": 215, - "7": 218, - "8": 173, - "9": 33, - "10": 93, - "11": 36, - "12": 203, - "13": 97, - "14": 215, - "15": 118, - "16": 202, - "17": 161, - "18": 187, - "19": 189, - "20": 87, - "21": 28, - "22": 99, - "23": 160, - "24": 169, - "25": 122, - "26": 234, - "27": 236, - "28": 192, - "29": 180, - "30": 147, - "31": 205 - }, - "s": { - "0": 99, - "1": 42, - "2": 218, - "3": 6, - "4": 72, - "5": 61, - "6": 190, - "7": 53, - "8": 64, - "9": 54, - "10": 215, - "11": 15, - "12": 151, - "13": 106, - "14": 226, - "15": 103, - "16": 57, - "17": 48, - "18": 14, - "19": 208, - "20": 149, - "21": 172, - "22": 233, - "23": 157, - "24": 142, - "25": 229, - "26": 104, - "27": 234, - "28": 206, - "29": 89, - "30": 66, - "31": 235 - }, - "index": 57, - "account": "0xc2f3A90C603796c7fB18F7C185253833390ef455", - "proof": [ - "0xbefd3fbde8993fc839ab3f147ca9f05c95c8abfdba6f0711699de8ce6625c854", - "0xe7dd43698a3723e9471ba1b10e3da11e19653c87a12c4877b1ecc1b58bc99253", - "0x7b3707c9f2cd7dcf94982da6bc7804f76623dadb493a19af67eda93f05c37b7b", - "0x153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1", - "0xbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 8, - "1": 92, - "2": 122, - "3": 104, - "4": 210, - "5": 81, - "6": 166, - "7": 34, - "8": 126, - "9": 105, - "10": 59, - "11": 237, - "12": 126, - "13": 121, - "14": 23, - "15": 140, - "16": 219, - "17": 190, - "18": 46, - "19": 107, - "20": 137, - "21": 228, - "22": 246, - "23": 211, - "24": 63, - "25": 24, - "26": 149, - "27": 216, - "28": 243, - "29": 44, - "30": 128, - "31": 31 - }, - "s": { - "0": 10, - "1": 252, - "2": 171, - "3": 15, - "4": 13, - "5": 99, - "6": 243, - "7": 64, - "8": 137, - "9": 120, - "10": 137, - "11": 249, - "12": 203, - "13": 234, - "14": 167, - "15": 242, - "16": 160, - "17": 11, - "18": 232, - "19": 90, - "20": 47, - "21": 90, - "22": 25, - "23": 147, - "24": 233, - "25": 222, - "26": 176, - "27": 162, - "28": 55, - "29": 235, - "30": 9, - "31": 81 - }, - "index": 63, - "account": "0xfaC9EA89bB4d1786FDb19D95f328A373217aa9D7", - "proof": [ - "0x29f8f9607b0797eaa36b2cad4675c663ac9a1e70ab192021974955f8ae2a7821", - "0x523cd54ef9e83351761619616255c7891d9b11c1ab5c1e48531f00e3f53bb7e6", - "0x3e7c6648ca3318e8b4f95e8de1bd6ec267ba0db4912f63b5441d93664b7d4d98", - "0x153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1", - "0xbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 242, - "1": 148, - "2": 182, - "3": 209, - "4": 163, - "5": 6, - "6": 167, - "7": 191, - "8": 54, - "9": 1, - "10": 162, - "11": 155, - "12": 216, - "13": 184, - "14": 183, - "15": 105, - "16": 113, - "17": 54, - "18": 190, - "19": 74, - "20": 222, - "21": 183, - "22": 225, - "23": 10, - "24": 54, - "25": 31, - "26": 166, - "27": 228, - "28": 50, - "29": 42, - "30": 239, - "31": 195 - }, - "s": { - "0": 68, - "1": 90, - "2": 131, - "3": 84, - "4": 210, - "5": 5, - "6": 157, - "7": 128, - "8": 175, - "9": 253, - "10": 227, - "11": 76, - "12": 207, - "13": 46, - "14": 247, - "15": 149, - "16": 65, - "17": 235, - "18": 219, - "19": 4, - "20": 83, - "21": 236, - "22": 173, - "23": 63, - "24": 113, - "25": 3, - "26": 194, - "27": 175, - "28": 2, - "29": 156, - "30": 171, - "31": 18 - }, - "index": 70, - "account": "0x177F562c6aDbf70046728ebcC286A6AC580cDcA2", - "proof": [ - "0xbd12e10220fdebc1d01da687a593b144f8b7029ef2060789635bc56289166171", - "0x1443397d832242fd62137ab750b5c65064fbef25bfa526b29914d123a5b129e8", - "0xfb8d08773869ebbe2e15f561f06c83a7d905e61cdefdc7b195f01a3c03452f1a", - "0xc64fbe72de8cc7b9397406e0de664c63b9fac1ab2a1dfa8829f990bdf2484e6b", - "0x2586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2b" - ] - } - ], - "finalValidatorsProofRaw": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000f40000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000014800000000000000000000000000000000000000000000000000000000000001640000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000019c00000000000000000000000000000000000000000000000000000000000001b800000000000000000000000000000000000000000000000000000000000001d400000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000020c000000000000000000000000000000000000000000000000000000000000022800000000000000000000000000000000000000000000000000000000000002440000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000029800000000000000000000000000000000000000000000000000000000000002b40000000000000000000000000000000000000000000000000000000000000001cd1537acdc77a060912ced5fff892b0f2d69785c894ca08ac8301eb2042cd694831cdf96897dd48ed661ecc76979716f2920926338730fd956f6abe9fec1b9e20000000000000000000000000000000000000000000000000000000000000000100000000000000000000000055e18e8c6ed1b12f220826e0279b60985de0f2b700000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000079f638d4795a7a68d02dda9c7029e9fa392658bdd9c2ec6670298d73c95ce6e970ddae405dc19ebec4a340811f1eaa8d1e2fde2902722839c252c46622c230dd9ecca7e49c86e7184782e17c6414f3725d72dd49cf8f074b0080b65dbffb708bba6d711e88370aadeeefc420a6f2c5dc4dd87a885f70d3c9ca65768ade41c483a2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b89cc042c48d1f218094fcf128b4c80c3e84c8d97f143067b94fb30777ab616b07a249c2d95972abdf0a2b14b4b6bc4dbc69ee53ea5f8635fcc012d63f039339a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000ba6705c26ee930eff285283939e588f574b7eda400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007fd869da58bcdcc433436cb281fbdb10e6ab48bc4d0f45eaf2f81cdccfaa621cf42d9ed32d1eafb57bda9732004ada71bebad93f8b86988d3d21e42589f89c6618970c381942a5e0bb57b7b254d06ccb5627f6f062252711b52a16245c640830baf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed42ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b70ae56d5d0ef60dae0cf0721d62eabddae11ecd3281b397fafe1f7314b82db793691e1438c67f867938ef44c1b45d6c18a9d08f937134add51c83e0e0600467900000000000000000000000000000000000000000000000000000000000000090000000000000000000000004c88d475766e01fe7db288e8949e8fbaec90b52300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007f2e5b9bec3c1f02022e7d8170ee87089057e17d02b4640671fc3f70c0c3bf6e842d9ed32d1eafb57bda9732004ada71bebad93f8b86988d3d21e42589f89c6618970c381942a5e0bb57b7b254d06ccb5627f6f062252711b52a16245c640830baf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed42ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bdc6b6945876f6b3f1fbba28ac5eac193046918906a2098ee2403b99cf108ee8830a4665f85398f9f1012637b8ae8fc020baa0f943bbcc80da512279c77cf4c0e000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000cea94bb26f6a706248f372eab9c5e932a8bf461700000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000071bb4f435c3b4b89bdfba70c5793028dc3d51c70fc44ea5ac42b7bf30c7a1c12b10a6a04620439420509dd181df6aeb01ec222e93ab257afd7e6ae8dd82540f1116e976b460155c4453c0c60e9f1a4f47ef620beb3882a9aed4af6564d99076d0af7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed42ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bc1c2020812d024e7ce1eb69e1180de9df695dd0eff2e6d3c34e4205864ed54fe03a9b9502f0aec114c628e5ca2ff87dc9744275f99f36ca0dc8e15b87f4d5546000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000ba347abdd8fc2fa86227a0249c0bac0eac5dbffd00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000702554d891e5d1d29838dd67f120dc601d2a9af5db3aa46d4f0597df94ce15017f33e999f73f666fbb0521c18262c9cb12b17dc7336acc35ffcd539799217e31316e976b460155c4453c0c60e9f1a4f47ef620beb3882a9aed4af6564d99076d0af7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed42ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b5fa58aa03ca9c41724741ed11cf9164267f5e14760376cf1b4b041363781443845cf98f0c210dbc56467332c62a4859707f058aad72bd059bb5e7c17f6f9222e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000007bd970810445290ef6b0d05c7f3e0f801cdad8a900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007718c9b5ce50b808883dc04947b051e3bef2ef0425dc132debbac5bb8d6087f44b11ccc23573a5958843aa903d1d0188ea7fc5f6bcf27e8c84eaebefb70f543665e4e72c113a324ef77787fd287e646b2e0ad5ab9ae80979db0e3095edbbc5d5eca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936edf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b1d0dc78c15843ee56b3145d4a73b3fb892a31df1803af967bea4bc0053009a9460864d47a77b48fc24664198bed43396a3a14fee39054bef42da080132d5582a0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000e89f1d28601bbe5e99a0db247b6d3b35fb02f9c500000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000075ba8ed0f8785e5666b7c442021ce7983f00921920d8478d55ed1e1c2e2425ebcb11ccc23573a5958843aa903d1d0188ea7fc5f6bcf27e8c84eaebefb70f543665e4e72c113a324ef77787fd287e646b2e0ad5ab9ae80979db0e3095edbbc5d5eca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936edf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c9593c2e499b0fada47b7386775f6cc7fb6aae4d17c4f540ba6d0e24b0b89e5417c0a3ef2b878982c1a24571f64de2df92e4b64ffe8368ed7242df597ef247a350000000000000000000000000000000000000000000000000000000000000015000000000000000000000000638a0850daffe6358aa80b8ae98ad0ec25061d4b00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000071c8e06d7b1687ffe2abba0cffcae8b39a0ec9a6a1f0f05992dfc06b756a4d771bbd75e40a5be8a6d964cb21e7d93a51af457266721ba0d82e446f32a255119edb870df94a423e3dfabd590045ba955d86795c8b5795d6388b898e3cbde24bdb6ca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936edf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bcd0a5d3af965a04fc0d60ac39d8b10048f2a8e0842a67740ba91a06a6415b4f53bbf81e8eed9681080237872bc8f104cd93f2189549c9f98a3fd0bb49b57699b000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000c122fa8524ae9897e0a0a788effa8dc149dd64d100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007f9705dd39c128105e60edee073f61a6709b14346aa654b4a5cb34388b66c16916ba91e46bd096f6e8b72c0fb921ec85fc08cd3fb2853a6579cb0130190328c50061bad1f99006db82b8189a8d4bcc96d6c3667336ba181acad98164ce6f114ed325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4df9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b343aa18f9e1dd094f950f83dfcd41cf39a35596a8ceef34a387a84126f543d736bb5218acad21896b78dc7c9483a4b31ca4e1831347963382e0f3ce82d735bc5000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000f9bf1ade364193268c3fd151e3e68796249c912e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007a7cb4572bf2962bb133980eb844b4997f8c098f09d9672e0af8e33777a0ef0926ba91e46bd096f6e8b72c0fb921ec85fc08cd3fb2853a6579cb0130190328c50061bad1f99006db82b8189a8d4bcc96d6c3667336ba181acad98164ce6f114ed325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4df9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b44bfedfa4af6c63188d7e91a4ca6d878eaffae489330030fc65bec17ad0510c9154c144359af2c4ae4a9052602c7a9dc87ab937bb5e5ba50b27103e5e78d15d7000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000005473090d3a9d7b984b31f2d36f2d004a9188796d00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000072d3fe5fcf7e9b1559b73b0055d813911a135fd0f7311e5a69899cf420c418c9f8df6a7abbefe9b2fe4e384876b71ec1eb90d23950c68b78df4e22909590d19307126a8044f997db28aaf469f8f66a8a4c09c25ab03c0b902bf02618d54d5e86e325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4df9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c83cb96ab3d0b13523992b050aabad6c626a8343af0d3eee72b7d6b30b39b6191302f2b4df395120b6d42cf7d9b93026302b7720b992c49742c2f58cb70a3df4800000000000000000000000000000000000000000000000000000000000000220000000000000000000000000bfc283b4769560580ecc8e1ac10746b3bd9aca400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007cbd43c389a6eff6fac6d5d3d24807e3bb10cdcb6b09d4b53268414d3b8974e9aa2db25aa7057e89d4f0e866cbdd150b76f94e4de7669320568f538a98c84388d8ef3bfbae8f9b410d233cdfe5d7e21a5efa8b14e8101924058008818e14b60799a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b6493d3940b5e813e87ec3e3d113def19bdfd2c5f19f49b5785cbfc7686067b6d71837f7c94fc3bb688b1cc5a71c7761344dc4f80da3515ce06a0cdcb683a034400000000000000000000000000000000000000000000000000000000000000240000000000000000000000008713ffec5c23955193bdbaa94c43e43091673b5f00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000796bb7448b75bc9288b782a3a15ed3a7e04be7232693dbadfa1c4b58b6f6fe3122d473663ea72fa4448c4f0ac34ca65f2786dddea9e86e3986d3ef6744a99d25baa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bedbf131551b80119a7c70844df4a1587373d9bef53111d3472077bc4dcd20f5058c3d85c85b08aedbb6af09f430981a2e3c7e0cab1dbd5246ea617a791b2cadc00000000000000000000000000000000000000000000000000000000000000250000000000000000000000008efb8e804f959f723a26ae7e1f2d6a55f2bf4b0100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000072b720bc8c7bd65302d3a9b6ed95709a5bdfffaa89f12a1b5d43905289c7d413f2d473663ea72fa4448c4f0ac34ca65f2786dddea9e86e3986d3ef6744a99d25baa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bff44c96097f7ca500ad886d90ff78a60aa3752ad813db083043c54ce0ab53e373367a298359c37df40868347529aed4f920083429cde72cbcab052fceda76b7c00000000000000000000000000000000000000000000000000000000000000260000000000000000000000006f57c6389c53ce81a689270533c4b44258feac7300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007cc2df11e3c69dffcc8187127a3b334432dc29635d2e5243aa5f8814a49dfb2339f28aef3ff250b849a119017971362e72cc6a981641230be766c00927bec6362aa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c1c736aba366c495ef890f85e7ac844af0aa05896ad50daf803d513b271d5f6a711ae0657313a6073cd6497560c8c94083df169e84e2551860fedea0d63a79b96000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000006742544686e53f20af2c142cc16237a00c73de8a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007ca98d350b190c5eccb37aa15728b19144c9759d396285a4e7f2a28c7809c8ebade649342947e1988655c618763d70685a13df42aa865cf359589548bc23a2a3edf87aa78616553aa20706bacdbbdd36e1144798c2856e10cdd4499faa7736c821c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bf93b32a7da38be03e6cc3a6458c9840680738f318947bf79947542c464d1939a66e1f13af83c02cc741994d94bf6f69e70ebe6a556e62a0688ce0f3fb79e6b42000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000001816545f1ec96a0dc86f507a269af7663d2982ac00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007520952d6f00e3741a5575c0f7f2090cd719216dbb3ced9d5c21c24dbce285798f40fe0fd52f06a2d6094f3decbbeb75424bf1ae7cb1e749f2950a0af77aa1dc53353786e8802d17d7b68581269cc7c782705a4fdb918a4a2973bfc4e7ec9e0a71c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c4d41d5daf0d6def2e6f39ce7f39d268280dfd809470451db0aa1f06e47ced1425f465e998a512de3d9ac6ecf5d9d203a177d39aea60fcb57da0c4e1373e0a08f000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000a34e066ba08f8fd62395faea13a32479593642300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000072dc32d91b583f563e8cc5fc3955eb9dacbca98a92a26765ca9e7e8954027595784ac7649882c9a452a02c49e4514ca792334eec158702060122e54f7853e0a353353786e8802d17d7b68581269cc7c782705a4fdb918a4a2973bfc4e7ec9e0a71c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c84cecc6117f99f70c5146be1635aca7381c218f17b28200571110eeb051f86ce6cceab08c4dfe5f14192940adb6a4e54f3728d85a314bff8f8b8869327329f780000000000000000000000000000000000000000000000000000000000000031000000000000000000000000e1b54fe1ce501b582c4e9bb0df1637730fb7af9100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007cdbcffc7df03d81faa7348cc74f9ee6d67f4ec8275c20b9b225ac1ee04e80d64c1bfe7aae1ec8d84327846f6acfa72c4133d33d5eb410d8ec99b9f35fd3939881f613d9f7e71d7dc4c307193b8d42896328a73e053cfe6a6e4cc786c10e43296a27b84005396060df67c11bed4504cdb87cf1ea758f6f4a140cb29494a087a4fbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b3dabeab6beb63d93d776080a3437f6003fea7b2d2accfcd33bf019648c25eb20251591b8cd27c1b42d76b797756d961b9aea0f917405f8db5744fab5d80b49c400000000000000000000000000000000000000000000000000000000000000330000000000000000000000002f1c6f5fcd931c27e1b2306852e21aca92fec6c500000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000079dccf3e45bea61fa594ba6e5d230fcc2421a38989251fba2e8bbc874cb420e414886bae121d2ce619dfd57e50df1edbdae59ff35dd8c2eabe61d5a99bdf4cef41f613d9f7e71d7dc4c307193b8d42896328a73e053cfe6a6e4cc786c10e43296a27b84005396060df67c11bed4504cdb87cf1ea758f6f4a140cb29494a087a4fbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bd507989b815920e58c3867e4d6cd96ac31673af1cf019dbeb70a38c6ed741e842bda5744c2d89eefb3c911c65e8ba1c51f88b7513f294a56a3c5446a9077e16b00000000000000000000000000000000000000000000000000000000000000380000000000000000000000003dae00899e4f81e2b447b39a3cff0ea4a8bc327300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000078c53e866a7ff52b8836810ea084a42336d638792ceca9ddb84429b690a9e0a0ee7dd43698a3723e9471ba1b10e3da11e19653c87a12c4877b1ecc1b58bc992537b3707c9f2cd7dcf94982da6bc7804f76623dadb493a19af67eda93f05c37b7b153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1bacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c7b0d15b9c41cd7daad215d24cb61d776caa1bbbd571c63a0a97aeaecc0b493cd632ada06483dbe354036d70f976ae26739300ed095ace99d8ee568eace5942eb0000000000000000000000000000000000000000000000000000000000000039000000000000000000000000c2f3a90c603796c7fb18f7c185253833390ef45500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007befd3fbde8993fc839ab3f147ca9f05c95c8abfdba6f0711699de8ce6625c854e7dd43698a3723e9471ba1b10e3da11e19653c87a12c4877b1ecc1b58bc992537b3707c9f2cd7dcf94982da6bc7804f76623dadb493a19af67eda93f05c37b7b153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1bacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c085c7a68d251a6227e693bed7e79178cdbbe2e6b89e4f6d33f1895d8f32c801f0afcab0f0d63f340897889f9cbeaa7f2a00be85a2f5a1993e9deb0a237eb0951000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000fac9ea89bb4d1786fdb19d95f328a373217aa9d700000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000729f8f9607b0797eaa36b2cad4675c663ac9a1e70ab192021974955f8ae2a7821523cd54ef9e83351761619616255c7891d9b11c1ab5c1e48531f00e3f53bb7e63e7c6648ca3318e8b4f95e8de1bd6ec267ba0db4912f63b5441d93664b7d4d98153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1bacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001cf294b6d1a306a7bf3601a29bd8b8b7697136be4adeb7e10a361fa6e4322aefc3445a8354d2059d80affde34ccf2ef79541ebdb0453ecad3f7103c2af029cab120000000000000000000000000000000000000000000000000000000000000046000000000000000000000000177f562c6adbf70046728ebcc286a6ac580cdca200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000005bd12e10220fdebc1d01da687a593b144f8b7029ef2060789635bc562891661711443397d832242fd62137ab750b5c65064fbef25bfa526b29914d123a5b129e8fb8d08773869ebbe2e15f561f06c83a7d905e61cdefdc7b195f01a3c03452f1ac64fbe72de8cc7b9397406e0de664c63b9fac1ab2a1dfa8829f990bdf2484e6b2586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2b" -} diff --git a/overridden_contracts/test/data/beefy-final-proof-3.json b/overridden_contracts/test/data/beefy-final-proof-3.json deleted file mode 100644 index fcedd09..0000000 --- a/overridden_contracts/test/data/beefy-final-proof-3.json +++ /dev/null @@ -1,2297 +0,0 @@ -{ - "finalValidatorsProof": [ - { - "v": 28, - "r": { - "0": 209, - "1": 83, - "2": 122, - "3": 205, - "4": 199, - "5": 122, - "6": 6, - "7": 9, - "8": 18, - "9": 206, - "10": 213, - "11": 255, - "12": 248, - "13": 146, - "14": 176, - "15": 242, - "16": 214, - "17": 151, - "18": 133, - "19": 200, - "20": 148, - "21": 202, - "22": 8, - "23": 172, - "24": 131, - "25": 1, - "26": 235, - "27": 32, - "28": 66, - "29": 205, - "30": 105, - "31": 72 - }, - "s": { - "0": 49, - "1": 205, - "2": 249, - "3": 104, - "4": 151, - "5": 221, - "6": 72, - "7": 237, - "8": 102, - "9": 30, - "10": 204, - "11": 118, - "12": 151, - "13": 151, - "14": 22, - "15": 242, - "16": 146, - "17": 9, - "18": 38, - "19": 51, - "20": 135, - "21": 48, - "22": 253, - "23": 149, - "24": 111, - "25": 106, - "26": 190, - "27": 159, - "28": 236, - "29": 27, - "30": 158, - "31": 32 - }, - "index": 1, - "account": "0x55E18e8C6Ed1b12F220826e0279B60985DE0F2b7", - "proof": [ - "0x9f638d4795a7a68d02dda9c7029e9fa392658bdd9c2ec6670298d73c95ce6e97", - "0x0ddae405dc19ebec4a340811f1eaa8d1e2fde2902722839c252c46622c230dd9", - "0xecca7e49c86e7184782e17c6414f3725d72dd49cf8f074b0080b65dbffb708bb", - "0xa6d711e88370aadeeefc420a6f2c5dc4dd87a885f70d3c9ca65768ade41c483a", - "0x2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b747311", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 137, - "1": 204, - "2": 4, - "3": 44, - "4": 72, - "5": 209, - "6": 242, - "7": 24, - "8": 9, - "9": 79, - "10": 207, - "11": 18, - "12": 139, - "13": 76, - "14": 128, - "15": 195, - "16": 232, - "17": 76, - "18": 141, - "19": 151, - "20": 241, - "21": 67, - "22": 6, - "23": 123, - "24": 148, - "25": 251, - "26": 48, - "27": 119, - "28": 122, - "29": 182, - "30": 22, - "31": 176 - }, - "s": { - "0": 122, - "1": 36, - "2": 156, - "3": 45, - "4": 149, - "5": 151, - "6": 42, - "7": 189, - "8": 240, - "9": 162, - "10": 177, - "11": 75, - "12": 75, - "13": 107, - "14": 196, - "15": 219, - "16": 198, - "17": 158, - "18": 229, - "19": 62, - "20": 165, - "21": 248, - "22": 99, - "23": 95, - "24": 204, - "25": 1, - "26": 45, - "27": 99, - "28": 240, - "29": 57, - "30": 51, - "31": 154 - }, - "index": 8, - "account": "0xbA6705c26ee930eFF285283939e588f574b7EDA4", - "proof": [ - "0xfd869da58bcdcc433436cb281fbdb10e6ab48bc4d0f45eaf2f81cdccfaa621cf", - "0x42d9ed32d1eafb57bda9732004ada71bebad93f8b86988d3d21e42589f89c661", - "0x8970c381942a5e0bb57b7b254d06ccb5627f6f062252711b52a16245c640830b", - "0xaf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed4", - "0x2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b747311", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 112, - "1": 174, - "2": 86, - "3": 213, - "4": 208, - "5": 239, - "6": 96, - "7": 218, - "8": 224, - "9": 207, - "10": 7, - "11": 33, - "12": 214, - "13": 46, - "14": 171, - "15": 221, - "16": 174, - "17": 17, - "18": 236, - "19": 211, - "20": 40, - "21": 27, - "22": 57, - "23": 127, - "24": 175, - "25": 225, - "26": 247, - "27": 49, - "28": 75, - "29": 130, - "30": 219, - "31": 121 - }, - "s": { - "0": 54, - "1": 145, - "2": 225, - "3": 67, - "4": 140, - "5": 103, - "6": 248, - "7": 103, - "8": 147, - "9": 142, - "10": 244, - "11": 76, - "12": 27, - "13": 69, - "14": 214, - "15": 193, - "16": 138, - "17": 157, - "18": 8, - "19": 249, - "20": 55, - "21": 19, - "22": 74, - "23": 221, - "24": 81, - "25": 200, - "26": 62, - "27": 14, - "28": 6, - "29": 0, - "30": 70, - "31": 121 - }, - "index": 9, - "account": "0x4c88d475766E01fe7dB288E8949E8fbAec90b523", - "proof": [ - "0xf2e5b9bec3c1f02022e7d8170ee87089057e17d02b4640671fc3f70c0c3bf6e8", - "0x42d9ed32d1eafb57bda9732004ada71bebad93f8b86988d3d21e42589f89c661", - "0x8970c381942a5e0bb57b7b254d06ccb5627f6f062252711b52a16245c640830b", - "0xaf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed4", - "0x2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b747311", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 220, - "1": 107, - "2": 105, - "3": 69, - "4": 135, - "5": 111, - "6": 107, - "7": 63, - "8": 31, - "9": 187, - "10": 162, - "11": 138, - "12": 197, - "13": 234, - "14": 193, - "15": 147, - "16": 4, - "17": 105, - "18": 24, - "19": 144, - "20": 106, - "21": 32, - "22": 152, - "23": 238, - "24": 36, - "25": 3, - "26": 185, - "27": 156, - "28": 241, - "29": 8, - "30": 238, - "31": 136 - }, - "s": { - "0": 48, - "1": 164, - "2": 102, - "3": 95, - "4": 133, - "5": 57, - "6": 143, - "7": 159, - "8": 16, - "9": 18, - "10": 99, - "11": 123, - "12": 138, - "13": 232, - "14": 252, - "15": 2, - "16": 11, - "17": 170, - "18": 15, - "19": 148, - "20": 59, - "21": 188, - "22": 200, - "23": 13, - "24": 165, - "25": 18, - "26": 39, - "27": 156, - "28": 119, - "29": 207, - "30": 76, - "31": 14 - }, - "index": 12, - "account": "0xcEA94bb26f6A706248f372EaB9C5e932a8bf4617", - "proof": [ - "0x1bb4f435c3b4b89bdfba70c5793028dc3d51c70fc44ea5ac42b7bf30c7a1c12b", - "0x10a6a04620439420509dd181df6aeb01ec222e93ab257afd7e6ae8dd82540f11", - "0x16e976b460155c4453c0c60e9f1a4f47ef620beb3882a9aed4af6564d99076d0", - "0xaf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed4", - "0x2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b747311", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 193, - "1": 194, - "2": 2, - "3": 8, - "4": 18, - "5": 208, - "6": 36, - "7": 231, - "8": 206, - "9": 30, - "10": 182, - "11": 158, - "12": 17, - "13": 128, - "14": 222, - "15": 157, - "16": 246, - "17": 149, - "18": 221, - "19": 14, - "20": 255, - "21": 46, - "22": 109, - "23": 60, - "24": 52, - "25": 228, - "26": 32, - "27": 88, - "28": 100, - "29": 237, - "30": 84, - "31": 254 - }, - "s": { - "0": 3, - "1": 169, - "2": 185, - "3": 80, - "4": 47, - "5": 10, - "6": 236, - "7": 17, - "8": 76, - "9": 98, - "10": 142, - "11": 92, - "12": 162, - "13": 255, - "14": 135, - "15": 220, - "16": 151, - "17": 68, - "18": 39, - "19": 95, - "20": 153, - "21": 243, - "22": 108, - "23": 160, - "24": 220, - "25": 142, - "26": 21, - "27": 184, - "28": 127, - "29": 77, - "30": 85, - "31": 70 - }, - "index": 14, - "account": "0xba347abDD8fc2Fa86227a0249C0baC0Eac5DbFFd", - "proof": [ - "0x02554d891e5d1d29838dd67f120dc601d2a9af5db3aa46d4f0597df94ce15017", - "0xf33e999f73f666fbb0521c18262c9cb12b17dc7336acc35ffcd539799217e313", - "0x16e976b460155c4453c0c60e9f1a4f47ef620beb3882a9aed4af6564d99076d0", - "0xaf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed4", - "0x2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b747311", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 95, - "1": 165, - "2": 138, - "3": 160, - "4": 60, - "5": 169, - "6": 196, - "7": 23, - "8": 36, - "9": 116, - "10": 30, - "11": 209, - "12": 28, - "13": 249, - "14": 22, - "15": 66, - "16": 103, - "17": 245, - "18": 225, - "19": 71, - "20": 96, - "21": 55, - "22": 108, - "23": 241, - "24": 180, - "25": 176, - "26": 65, - "27": 54, - "28": 55, - "29": 129, - "30": 68, - "31": 56 - }, - "s": { - "0": 69, - "1": 207, - "2": 152, - "3": 240, - "4": 194, - "5": 16, - "6": 219, - "7": 197, - "8": 100, - "9": 103, - "10": 51, - "11": 44, - "12": 98, - "13": 164, - "14": 133, - "15": 151, - "16": 7, - "17": 240, - "18": 88, - "19": 170, - "20": 215, - "21": 43, - "22": 208, - "23": 89, - "24": 187, - "25": 94, - "26": 124, - "27": 23, - "28": 246, - "29": 249, - "30": 34, - "31": 46 - }, - "index": 18, - "account": "0x7bD970810445290Ef6B0d05C7f3e0f801cDAD8a9", - "proof": [ - "0x718c9b5ce50b808883dc04947b051e3bef2ef0425dc132debbac5bb8d6087f44", - "0xb11ccc23573a5958843aa903d1d0188ea7fc5f6bcf27e8c84eaebefb70f54366", - "0x5e4e72c113a324ef77787fd287e646b2e0ad5ab9ae80979db0e3095edbbc5d5e", - "0xca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936e", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 29, - "1": 13, - "2": 199, - "3": 140, - "4": 21, - "5": 132, - "6": 62, - "7": 229, - "8": 107, - "9": 49, - "10": 69, - "11": 212, - "12": 167, - "13": 59, - "14": 63, - "15": 184, - "16": 146, - "17": 163, - "18": 29, - "19": 241, - "20": 128, - "21": 58, - "22": 249, - "23": 103, - "24": 190, - "25": 164, - "26": 188, - "27": 0, - "28": 83, - "29": 0, - "30": 154, - "31": 148 - }, - "s": { - "0": 96, - "1": 134, - "2": 77, - "3": 71, - "4": 167, - "5": 123, - "6": 72, - "7": 252, - "8": 36, - "9": 102, - "10": 65, - "11": 152, - "12": 190, - "13": 212, - "14": 51, - "15": 150, - "16": 163, - "17": 161, - "18": 79, - "19": 238, - "20": 57, - "21": 5, - "22": 75, - "23": 239, - "24": 66, - "25": 218, - "26": 8, - "27": 1, - "28": 50, - "29": 213, - "30": 88, - "31": 42 - }, - "index": 19, - "account": "0xe89F1D28601bbe5E99A0db247b6d3B35Fb02f9C5", - "proof": [ - "0x5ba8ed0f8785e5666b7c442021ce7983f00921920d8478d55ed1e1c2e2425ebc", - "0xb11ccc23573a5958843aa903d1d0188ea7fc5f6bcf27e8c84eaebefb70f54366", - "0x5e4e72c113a324ef77787fd287e646b2e0ad5ab9ae80979db0e3095edbbc5d5e", - "0xca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936e", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 149, - "1": 147, - "2": 194, - "3": 228, - "4": 153, - "5": 176, - "6": 250, - "7": 218, - "8": 71, - "9": 183, - "10": 56, - "11": 103, - "12": 117, - "13": 246, - "14": 204, - "15": 127, - "16": 182, - "17": 170, - "18": 228, - "19": 209, - "20": 124, - "21": 79, - "22": 84, - "23": 11, - "24": 166, - "25": 208, - "26": 226, - "27": 75, - "28": 11, - "29": 137, - "30": 229, - "31": 65 - }, - "s": { - "0": 124, - "1": 10, - "2": 62, - "3": 242, - "4": 184, - "5": 120, - "6": 152, - "7": 44, - "8": 26, - "9": 36, - "10": 87, - "11": 31, - "12": 100, - "13": 222, - "14": 45, - "15": 249, - "16": 46, - "17": 75, - "18": 100, - "19": 255, - "20": 232, - "21": 54, - "22": 142, - "23": 215, - "24": 36, - "25": 45, - "26": 245, - "27": 151, - "28": 239, - "29": 36, - "30": 122, - "31": 53 - }, - "index": 21, - "account": "0x638a0850DAffe6358aA80b8aE98Ad0EC25061D4B", - "proof": [ - "0x1c8e06d7b1687ffe2abba0cffcae8b39a0ec9a6a1f0f05992dfc06b756a4d771", - "0xbbd75e40a5be8a6d964cb21e7d93a51af457266721ba0d82e446f32a255119ed", - "0xb870df94a423e3dfabd590045ba955d86795c8b5795d6388b898e3cbde24bdb6", - "0xca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936e", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 12, - "1": 14, - "2": 25, - "3": 13, - "4": 33, - "5": 140, - "6": 154, - "7": 218, - "8": 54, - "9": 163, - "10": 16, - "11": 31, - "12": 73, - "13": 116, - "14": 154, - "15": 149, - "16": 216, - "17": 14, - "18": 103, - "19": 149, - "20": 117, - "21": 123, - "22": 113, - "23": 65, - "24": 18, - "25": 145, - "26": 230, - "27": 29, - "28": 171, - "29": 254, - "30": 252, - "31": 208 - }, - "s": { - "0": 123, - "1": 146, - "2": 94, - "3": 241, - "4": 64, - "5": 186, - "6": 95, - "7": 13, - "8": 84, - "9": 188, - "10": 223, - "11": 80, - "12": 84, - "13": 79, - "14": 104, - "15": 97, - "16": 208, - "17": 63, - "18": 7, - "19": 152, - "20": 183, - "21": 80, - "22": 141, - "23": 207, - "24": 143, - "25": 67, - "26": 157, - "27": 226, - "28": 65, - "29": 120, - "30": 227, - "31": 180 - }, - "index": 25, - "account": "0x6897b2Bc599b856B971A29b79392a81727Aea312", - "proof": [ - "0xd42355ceea991b5e798f4848ad9b651f1f0785a79f38ca7719e9883b381d34cb", - "0x3f47490c4bc88013808223b15d34755117ecc6b07b2bd5f0b970b034a40a0be4", - "0x061bad1f99006db82b8189a8d4bcc96d6c3667336ba181acad98164ce6f114ed", - "0x325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 205, - "1": 10, - "2": 93, - "3": 58, - "4": 249, - "5": 101, - "6": 160, - "7": 79, - "8": 192, - "9": 214, - "10": 10, - "11": 195, - "12": 157, - "13": 139, - "14": 16, - "15": 4, - "16": 143, - "17": 42, - "18": 142, - "19": 8, - "20": 66, - "21": 166, - "22": 119, - "23": 64, - "24": 186, - "25": 145, - "26": 160, - "27": 106, - "28": 100, - "29": 21, - "30": 180, - "31": 245 - }, - "s": { - "0": 59, - "1": 191, - "2": 129, - "3": 232, - "4": 238, - "5": 217, - "6": 104, - "7": 16, - "8": 128, - "9": 35, - "10": 120, - "11": 114, - "12": 188, - "13": 143, - "14": 16, - "15": 76, - "16": 217, - "17": 63, - "18": 33, - "19": 137, - "20": 84, - "21": 156, - "22": 159, - "23": 152, - "24": 163, - "25": 253, - "26": 11, - "27": 180, - "28": 155, - "29": 87, - "30": 105, - "31": 155 - }, - "index": 26, - "account": "0xC122fA8524AE9897E0a0A788EFFA8Dc149Dd64d1", - "proof": [ - "0xf9705dd39c128105e60edee073f61a6709b14346aa654b4a5cb34388b66c1691", - "0x6ba91e46bd096f6e8b72c0fb921ec85fc08cd3fb2853a6579cb0130190328c50", - "0x061bad1f99006db82b8189a8d4bcc96d6c3667336ba181acad98164ce6f114ed", - "0x325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 52, - "1": 58, - "2": 161, - "3": 143, - "4": 158, - "5": 29, - "6": 208, - "7": 148, - "8": 249, - "9": 80, - "10": 248, - "11": 61, - "12": 252, - "13": 212, - "14": 28, - "15": 243, - "16": 154, - "17": 53, - "18": 89, - "19": 106, - "20": 140, - "21": 238, - "22": 243, - "23": 74, - "24": 56, - "25": 122, - "26": 132, - "27": 18, - "28": 111, - "29": 84, - "30": 61, - "31": 115 - }, - "s": { - "0": 107, - "1": 181, - "2": 33, - "3": 138, - "4": 202, - "5": 210, - "6": 24, - "7": 150, - "8": 183, - "9": 141, - "10": 199, - "11": 201, - "12": 72, - "13": 58, - "14": 75, - "15": 49, - "16": 202, - "17": 78, - "18": 24, - "19": 49, - "20": 52, - "21": 121, - "22": 99, - "23": 56, - "24": 46, - "25": 15, - "26": 60, - "27": 232, - "28": 45, - "29": 115, - "30": 91, - "31": 197 - }, - "index": 27, - "account": "0xF9bF1ADE364193268c3fD151E3E68796249c912E", - "proof": [ - "0xa7cb4572bf2962bb133980eb844b4997f8c098f09d9672e0af8e33777a0ef092", - "0x6ba91e46bd096f6e8b72c0fb921ec85fc08cd3fb2853a6579cb0130190328c50", - "0x061bad1f99006db82b8189a8d4bcc96d6c3667336ba181acad98164ce6f114ed", - "0x325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 145, - "1": 83, - "2": 236, - "3": 75, - "4": 32, - "5": 76, - "6": 75, - "7": 88, - "8": 80, - "9": 172, - "10": 104, - "11": 185, - "12": 166, - "13": 127, - "14": 73, - "15": 8, - "16": 102, - "17": 82, - "18": 118, - "19": 189, - "20": 238, - "21": 9, - "22": 157, - "23": 193, - "24": 103, - "25": 202, - "26": 221, - "27": 16, - "28": 148, - "29": 115, - "30": 129, - "31": 207 - }, - "s": { - "0": 51, - "1": 146, - "2": 201, - "3": 196, - "4": 24, - "5": 180, - "6": 88, - "7": 176, - "8": 145, - "9": 24, - "10": 67, - "11": 45, - "12": 132, - "13": 136, - "14": 112, - "15": 95, - "16": 237, - "17": 166, - "18": 72, - "19": 116, - "20": 246, - "21": 215, - "22": 168, - "23": 5, - "24": 233, - "25": 26, - "26": 248, - "27": 222, - "28": 191, - "29": 217, - "30": 28, - "31": 151 - }, - "index": 29, - "account": "0x5f6E1DF54540035e8117436953B6e551179FC678", - "proof": [ - "0x387f1f7945c59ff550cf4a3d1d66136d529b21817110b514ead2aeef3abf12eb", - "0xf8ce7254a333528d4e83af789e3758b74b6ac37d0272d6795a6eeb4c4394f17a", - "0x7126a8044f997db28aaf469f8f66a8a4c09c25ab03c0b902bf02618d54d5e86e", - "0x325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 68, - "1": 191, - "2": 237, - "3": 250, - "4": 74, - "5": 246, - "6": 198, - "7": 49, - "8": 136, - "9": 215, - "10": 233, - "11": 26, - "12": 76, - "13": 166, - "14": 216, - "15": 120, - "16": 234, - "17": 255, - "18": 174, - "19": 72, - "20": 147, - "21": 48, - "22": 3, - "23": 15, - "24": 198, - "25": 91, - "26": 236, - "27": 23, - "28": 173, - "29": 5, - "30": 16, - "31": 201 - }, - "s": { - "0": 21, - "1": 76, - "2": 20, - "3": 67, - "4": 89, - "5": 175, - "6": 44, - "7": 74, - "8": 228, - "9": 169, - "10": 5, - "11": 38, - "12": 2, - "13": 199, - "14": 169, - "15": 220, - "16": 135, - "17": 171, - "18": 147, - "19": 123, - "20": 181, - "21": 229, - "22": 186, - "23": 80, - "24": 178, - "25": 113, - "26": 3, - "27": 229, - "28": 231, - "29": 141, - "30": 21, - "31": 215 - }, - "index": 31, - "account": "0x5473090d3a9D7B984B31f2d36f2d004a9188796d", - "proof": [ - "0x2d3fe5fcf7e9b1559b73b0055d813911a135fd0f7311e5a69899cf420c418c9f", - "0x8df6a7abbefe9b2fe4e384876b71ec1eb90d23950c68b78df4e22909590d1930", - "0x7126a8044f997db28aaf469f8f66a8a4c09c25ab03c0b902bf02618d54d5e86e", - "0x325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4", - "0xdf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed", - "0x8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 63, - "1": 107, - "2": 255, - "3": 195, - "4": 8, - "5": 195, - "6": 168, - "7": 152, - "8": 184, - "9": 72, - "10": 117, - "11": 149, - "12": 156, - "13": 194, - "14": 6, - "15": 96, - "16": 194, - "17": 99, - "18": 97, - "19": 63, - "20": 219, - "21": 223, - "22": 202, - "23": 183, - "24": 216, - "25": 11, - "26": 122, - "27": 80, - "28": 133, - "29": 170, - "30": 150, - "31": 238 - }, - "s": { - "0": 57, - "1": 239, - "2": 57, - "3": 154, - "4": 217, - "5": 120, - "6": 121, - "7": 136, - "8": 254, - "9": 185, - "10": 114, - "11": 81, - "12": 144, - "13": 199, - "14": 90, - "15": 119, - "16": 169, - "17": 124, - "18": 82, - "19": 145, - "20": 131, - "21": 200, - "22": 128, - "23": 243, - "24": 109, - "25": 76, - "26": 146, - "27": 247, - "28": 13, - "29": 222, - "30": 250, - "31": 78 - }, - "index": 32, - "account": "0x7165efA8a63155A662Aa5781EA58b91B27253932", - "proof": [ - "0xfb134026186c34bd460714bae0e8658c3b324b0b57a76d10cb405e21cc218633", - "0xb71a43f8fcffdd983ac18f7c5dbcd69e6aa3e203a9ce09d40a5234e1925153dd", - "0x8ef3bfbae8f9b410d233cdfe5d7e21a5efa8b14e8101924058008818e14b6079", - "0x9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 131, - "1": 203, - "2": 150, - "3": 171, - "4": 61, - "5": 11, - "6": 19, - "7": 82, - "8": 57, - "9": 146, - "10": 176, - "11": 80, - "12": 170, - "13": 186, - "14": 214, - "15": 198, - "16": 38, - "17": 168, - "18": 52, - "19": 58, - "20": 240, - "21": 211, - "22": 238, - "23": 231, - "24": 43, - "25": 125, - "26": 107, - "27": 48, - "28": 179, - "29": 155, - "30": 97, - "31": 145 - }, - "s": { - "0": 48, - "1": 47, - "2": 43, - "3": 77, - "4": 243, - "5": 149, - "6": 18, - "7": 11, - "8": 109, - "9": 66, - "10": 207, - "11": 125, - "12": 155, - "13": 147, - "14": 2, - "15": 99, - "16": 2, - "17": 183, - "18": 114, - "19": 11, - "20": 153, - "21": 44, - "22": 73, - "23": 116, - "24": 44, - "25": 47, - "26": 88, - "27": 203, - "28": 112, - "29": 163, - "30": 223, - "31": 72 - }, - "index": 34, - "account": "0x0bfC283B4769560580eCc8e1AC10746b3BD9ACA4", - "proof": [ - "0xcbd43c389a6eff6fac6d5d3d24807e3bb10cdcb6b09d4b53268414d3b8974e9a", - "0xa2db25aa7057e89d4f0e866cbdd150b76f94e4de7669320568f538a98c84388d", - "0x8ef3bfbae8f9b410d233cdfe5d7e21a5efa8b14e8101924058008818e14b6079", - "0x9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 100, - "1": 147, - "2": 211, - "3": 148, - "4": 11, - "5": 94, - "6": 129, - "7": 62, - "8": 135, - "9": 236, - "10": 62, - "11": 61, - "12": 17, - "13": 61, - "14": 239, - "15": 25, - "16": 189, - "17": 253, - "18": 44, - "19": 95, - "20": 25, - "21": 244, - "22": 155, - "23": 87, - "24": 133, - "25": 203, - "26": 252, - "27": 118, - "28": 134, - "29": 6, - "30": 123, - "31": 109 - }, - "s": { - "0": 113, - "1": 131, - "2": 127, - "3": 124, - "4": 148, - "5": 252, - "6": 59, - "7": 182, - "8": 136, - "9": 177, - "10": 204, - "11": 90, - "12": 113, - "13": 199, - "14": 118, - "15": 19, - "16": 68, - "17": 220, - "18": 79, - "19": 128, - "20": 218, - "21": 53, - "22": 21, - "23": 206, - "24": 6, - "25": 160, - "26": 205, - "27": 203, - "28": 104, - "29": 58, - "30": 3, - "31": 68 - }, - "index": 36, - "account": "0x8713FfeC5c23955193bDBAa94c43E43091673B5f", - "proof": [ - "0x96bb7448b75bc9288b782a3a15ed3a7e04be7232693dbadfa1c4b58b6f6fe312", - "0x2d473663ea72fa4448c4f0ac34ca65f2786dddea9e86e3986d3ef6744a99d25b", - "0xaa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc", - "0x9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 237, - "1": 191, - "2": 19, - "3": 21, - "4": 81, - "5": 184, - "6": 1, - "7": 25, - "8": 167, - "9": 199, - "10": 8, - "11": 68, - "12": 223, - "13": 74, - "14": 21, - "15": 135, - "16": 55, - "17": 61, - "18": 155, - "19": 239, - "20": 83, - "21": 17, - "22": 29, - "23": 52, - "24": 114, - "25": 7, - "26": 123, - "27": 196, - "28": 220, - "29": 210, - "30": 15, - "31": 80 - }, - "s": { - "0": 88, - "1": 195, - "2": 216, - "3": 92, - "4": 133, - "5": 176, - "6": 138, - "7": 237, - "8": 187, - "9": 106, - "10": 240, - "11": 159, - "12": 67, - "13": 9, - "14": 129, - "15": 162, - "16": 227, - "17": 199, - "18": 224, - "19": 202, - "20": 177, - "21": 219, - "22": 213, - "23": 36, - "24": 110, - "25": 166, - "26": 23, - "27": 167, - "28": 145, - "29": 178, - "30": 202, - "31": 220 - }, - "index": 37, - "account": "0x8efB8e804f959f723a26ae7e1f2d6a55f2Bf4b01", - "proof": [ - "0x2b720bc8c7bd65302d3a9b6ed95709a5bdfffaa89f12a1b5d43905289c7d413f", - "0x2d473663ea72fa4448c4f0ac34ca65f2786dddea9e86e3986d3ef6744a99d25b", - "0xaa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc", - "0x9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 255, - "1": 68, - "2": 201, - "3": 96, - "4": 151, - "5": 247, - "6": 202, - "7": 80, - "8": 10, - "9": 216, - "10": 134, - "11": 217, - "12": 15, - "13": 247, - "14": 138, - "15": 96, - "16": 170, - "17": 55, - "18": 82, - "19": 173, - "20": 129, - "21": 61, - "22": 176, - "23": 131, - "24": 4, - "25": 60, - "26": 84, - "27": 206, - "28": 10, - "29": 181, - "30": 62, - "31": 55 - }, - "s": { - "0": 51, - "1": 103, - "2": 162, - "3": 152, - "4": 53, - "5": 156, - "6": 55, - "7": 223, - "8": 64, - "9": 134, - "10": 131, - "11": 71, - "12": 82, - "13": 154, - "14": 237, - "15": 79, - "16": 146, - "17": 0, - "18": 131, - "19": 66, - "20": 156, - "21": 222, - "22": 114, - "23": 203, - "24": 202, - "25": 176, - "26": 82, - "27": 252, - "28": 237, - "29": 167, - "30": 107, - "31": 124 - }, - "index": 38, - "account": "0x6F57c6389c53cE81a689270533c4B44258FEaC73", - "proof": [ - "0xcc2df11e3c69dffcc8187127a3b334432dc29635d2e5243aa5f8814a49dfb233", - "0x9f28aef3ff250b849a119017971362e72cc6a981641230be766c00927bec6362", - "0xaa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc", - "0x9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 28, - "1": 115, - "2": 106, - "3": 186, - "4": 54, - "5": 108, - "6": 73, - "7": 94, - "8": 248, - "9": 144, - "10": 248, - "11": 94, - "12": 122, - "13": 200, - "14": 68, - "15": 175, - "16": 10, - "17": 160, - "18": 88, - "19": 150, - "20": 173, - "21": 80, - "22": 218, - "23": 248, - "24": 3, - "25": 213, - "26": 19, - "27": 178, - "28": 113, - "29": 213, - "30": 246, - "31": 167 - }, - "s": { - "0": 17, - "1": 174, - "2": 6, - "3": 87, - "4": 49, - "5": 58, - "6": 96, - "7": 115, - "8": 205, - "9": 100, - "10": 151, - "11": 86, - "12": 12, - "13": 140, - "14": 148, - "15": 8, - "16": 61, - "17": 241, - "18": 105, - "19": 232, - "20": 78, - "21": 37, - "22": 81, - "23": 134, - "24": 15, - "25": 237, - "26": 234, - "27": 13, - "28": 99, - "29": 167, - "30": 155, - "31": 150 - }, - "index": 42, - "account": "0x6742544686e53F20aF2C142CC16237a00c73dE8a", - "proof": [ - "0xca98d350b190c5eccb37aa15728b19144c9759d396285a4e7f2a28c7809c8eba", - "0xde649342947e1988655c618763d70685a13df42aa865cf359589548bc23a2a3e", - "0xdf87aa78616553aa20706bacdbbdd36e1144798c2856e10cdd4499faa7736c82", - "0x1c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 249, - "1": 59, - "2": 50, - "3": 167, - "4": 218, - "5": 56, - "6": 190, - "7": 3, - "8": 230, - "9": 204, - "10": 58, - "11": 100, - "12": 88, - "13": 201, - "14": 132, - "15": 6, - "16": 128, - "17": 115, - "18": 143, - "19": 49, - "20": 137, - "21": 71, - "22": 191, - "23": 121, - "24": 148, - "25": 117, - "26": 66, - "27": 196, - "28": 100, - "29": 209, - "30": 147, - "31": 154 - }, - "s": { - "0": 102, - "1": 225, - "2": 241, - "3": 58, - "4": 248, - "5": 60, - "6": 2, - "7": 204, - "8": 116, - "9": 25, - "10": 148, - "11": 217, - "12": 75, - "13": 246, - "14": 246, - "15": 158, - "16": 112, - "17": 235, - "18": 230, - "19": 165, - "20": 86, - "21": 230, - "22": 42, - "23": 6, - "24": 136, - "25": 206, - "26": 15, - "27": 63, - "28": 183, - "29": 158, - "30": 107, - "31": 66 - }, - "index": 44, - "account": "0x1816545f1Ec96A0Dc86f507A269aF7663d2982ac", - "proof": [ - "0x520952d6f00e3741a5575c0f7f2090cd719216dbb3ced9d5c21c24dbce285798", - "0xf40fe0fd52f06a2d6094f3decbbeb75424bf1ae7cb1e749f2950a0af77aa1dc5", - "0x3353786e8802d17d7b68581269cc7c782705a4fdb918a4a2973bfc4e7ec9e0a7", - "0x1c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 77, - "1": 65, - "2": 213, - "3": 218, - "4": 240, - "5": 214, - "6": 222, - "7": 242, - "8": 230, - "9": 243, - "10": 156, - "11": 231, - "12": 243, - "13": 157, - "14": 38, - "15": 130, - "16": 128, - "17": 223, - "18": 216, - "19": 9, - "20": 71, - "21": 4, - "22": 81, - "23": 219, - "24": 10, - "25": 161, - "26": 240, - "27": 110, - "28": 71, - "29": 206, - "30": 209, - "31": 66 - }, - "s": { - "0": 95, - "1": 70, - "2": 94, - "3": 153, - "4": 138, - "5": 81, - "6": 45, - "7": 227, - "8": 217, - "9": 172, - "10": 110, - "11": 207, - "12": 93, - "13": 157, - "14": 32, - "15": 58, - "16": 23, - "17": 125, - "18": 57, - "19": 174, - "20": 166, - "21": 15, - "22": 203, - "23": 87, - "24": 218, - "25": 12, - "26": 78, - "27": 19, - "28": 115, - "29": 224, - "30": 160, - "31": 143 - }, - "index": 46, - "account": "0x0A34E066bA08F8fD62395FaEa13A324795936423", - "proof": [ - "0x2dc32d91b583f563e8cc5fc3955eb9dacbca98a92a26765ca9e7e89540275957", - "0x84ac7649882c9a452a02c49e4514ca792334eec158702060122e54f7853e0a35", - "0x3353786e8802d17d7b68581269cc7c782705a4fdb918a4a2973bfc4e7ec9e0a7", - "0x1c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514", - "0xdf1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 132, - "1": 206, - "2": 204, - "3": 97, - "4": 23, - "5": 249, - "6": 159, - "7": 112, - "8": 197, - "9": 20, - "10": 107, - "11": 225, - "12": 99, - "13": 90, - "14": 202, - "15": 115, - "16": 129, - "17": 194, - "18": 24, - "19": 241, - "20": 123, - "21": 40, - "22": 32, - "23": 5, - "24": 113, - "25": 17, - "26": 14, - "27": 235, - "28": 5, - "29": 31, - "30": 134, - "31": 206 - }, - "s": { - "0": 108, - "1": 206, - "2": 171, - "3": 8, - "4": 196, - "5": 223, - "6": 229, - "7": 241, - "8": 65, - "9": 146, - "10": 148, - "11": 10, - "12": 219, - "13": 106, - "14": 78, - "15": 84, - "16": 243, - "17": 114, - "18": 141, - "19": 133, - "20": 163, - "21": 20, - "22": 191, - "23": 248, - "24": 248, - "25": 184, - "26": 134, - "27": 147, - "28": 39, - "29": 50, - "30": 159, - "31": 120 - }, - "index": 49, - "account": "0xe1b54fe1Ce501B582C4E9BB0DF1637730fB7AF91", - "proof": [ - "0xcdbcffc7df03d81faa7348cc74f9ee6d67f4ec8275c20b9b225ac1ee04e80d64", - "0xc1bfe7aae1ec8d84327846f6acfa72c4133d33d5eb410d8ec99b9f35fd393988", - "0x1f613d9f7e71d7dc4c307193b8d42896328a73e053cfe6a6e4cc786c10e43296", - "0xa27b84005396060df67c11bed4504cdb87cf1ea758f6f4a140cb29494a087a4f", - "0xbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 61, - "1": 171, - "2": 234, - "3": 182, - "4": 190, - "5": 182, - "6": 61, - "7": 147, - "8": 215, - "9": 118, - "10": 8, - "11": 10, - "12": 52, - "13": 55, - "14": 246, - "15": 0, - "16": 63, - "17": 234, - "18": 123, - "19": 45, - "20": 42, - "21": 204, - "22": 252, - "23": 211, - "24": 59, - "25": 240, - "26": 25, - "27": 100, - "28": 140, - "29": 37, - "30": 235, - "31": 32 - }, - "s": { - "0": 37, - "1": 21, - "2": 145, - "3": 184, - "4": 205, - "5": 39, - "6": 193, - "7": 180, - "8": 45, - "9": 118, - "10": 183, - "11": 151, - "12": 117, - "13": 109, - "14": 150, - "15": 27, - "16": 154, - "17": 234, - "18": 15, - "19": 145, - "20": 116, - "21": 5, - "22": 248, - "23": 219, - "24": 87, - "25": 68, - "26": 250, - "27": 181, - "28": 216, - "29": 11, - "30": 73, - "31": 196 - }, - "index": 51, - "account": "0x2f1C6F5fCD931C27e1b2306852e21Aca92Fec6c5", - "proof": [ - "0x9dccf3e45bea61fa594ba6e5d230fcc2421a38989251fba2e8bbc874cb420e41", - "0x4886bae121d2ce619dfd57e50df1edbdae59ff35dd8c2eabe61d5a99bdf4cef4", - "0x1f613d9f7e71d7dc4c307193b8d42896328a73e053cfe6a6e4cc786c10e43296", - "0xa27b84005396060df67c11bed4504cdb87cf1ea758f6f4a140cb29494a087a4f", - "0xbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 27, - "r": { - "0": 213, - "1": 7, - "2": 152, - "3": 155, - "4": 129, - "5": 89, - "6": 32, - "7": 229, - "8": 140, - "9": 56, - "10": 103, - "11": 228, - "12": 214, - "13": 205, - "14": 150, - "15": 172, - "16": 49, - "17": 103, - "18": 58, - "19": 241, - "20": 207, - "21": 1, - "22": 157, - "23": 190, - "24": 183, - "25": 10, - "26": 56, - "27": 198, - "28": 237, - "29": 116, - "30": 30, - "31": 132 - }, - "s": { - "0": 43, - "1": 218, - "2": 87, - "3": 68, - "4": 194, - "5": 216, - "6": 158, - "7": 239, - "8": 179, - "9": 201, - "10": 17, - "11": 198, - "12": 94, - "13": 139, - "14": 161, - "15": 197, - "16": 31, - "17": 136, - "18": 183, - "19": 81, - "20": 63, - "21": 41, - "22": 74, - "23": 86, - "24": 163, - "25": 197, - "26": 68, - "27": 106, - "28": 144, - "29": 119, - "30": 225, - "31": 107 - }, - "index": 56, - "account": "0x3DAe00899E4f81E2B447b39a3CFF0eA4a8BC3273", - "proof": [ - "0x8c53e866a7ff52b8836810ea084a42336d638792ceca9ddb84429b690a9e0a0e", - "0xe7dd43698a3723e9471ba1b10e3da11e19653c87a12c4877b1ecc1b58bc99253", - "0x7b3707c9f2cd7dcf94982da6bc7804f76623dadb493a19af67eda93f05c37b7b", - "0x153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1", - "0xbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 123, - "1": 13, - "2": 21, - "3": 185, - "4": 196, - "5": 28, - "6": 215, - "7": 218, - "8": 173, - "9": 33, - "10": 93, - "11": 36, - "12": 203, - "13": 97, - "14": 215, - "15": 118, - "16": 202, - "17": 161, - "18": 187, - "19": 189, - "20": 87, - "21": 28, - "22": 99, - "23": 160, - "24": 169, - "25": 122, - "26": 234, - "27": 236, - "28": 192, - "29": 180, - "30": 147, - "31": 205 - }, - "s": { - "0": 99, - "1": 42, - "2": 218, - "3": 6, - "4": 72, - "5": 61, - "6": 190, - "7": 53, - "8": 64, - "9": 54, - "10": 215, - "11": 15, - "12": 151, - "13": 106, - "14": 226, - "15": 103, - "16": 57, - "17": 48, - "18": 14, - "19": 208, - "20": 149, - "21": 172, - "22": 233, - "23": 157, - "24": 142, - "25": 229, - "26": 104, - "27": 234, - "28": 206, - "29": 89, - "30": 66, - "31": 235 - }, - "index": 57, - "account": "0xc2f3A90C603796c7fB18F7C185253833390ef455", - "proof": [ - "0xbefd3fbde8993fc839ab3f147ca9f05c95c8abfdba6f0711699de8ce6625c854", - "0xe7dd43698a3723e9471ba1b10e3da11e19653c87a12c4877b1ecc1b58bc99253", - "0x7b3707c9f2cd7dcf94982da6bc7804f76623dadb493a19af67eda93f05c37b7b", - "0x153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1", - "0xbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 8, - "1": 92, - "2": 122, - "3": 104, - "4": 210, - "5": 81, - "6": 166, - "7": 34, - "8": 126, - "9": 105, - "10": 59, - "11": 237, - "12": 126, - "13": 121, - "14": 23, - "15": 140, - "16": 219, - "17": 190, - "18": 46, - "19": 107, - "20": 137, - "21": 228, - "22": 246, - "23": 211, - "24": 63, - "25": 24, - "26": 149, - "27": 216, - "28": 243, - "29": 44, - "30": 128, - "31": 31 - }, - "s": { - "0": 10, - "1": 252, - "2": 171, - "3": 15, - "4": 13, - "5": 99, - "6": 243, - "7": 64, - "8": 137, - "9": 120, - "10": 137, - "11": 249, - "12": 203, - "13": 234, - "14": 167, - "15": 242, - "16": 160, - "17": 11, - "18": 232, - "19": 90, - "20": 47, - "21": 90, - "22": 25, - "23": 147, - "24": 233, - "25": 222, - "26": 176, - "27": 162, - "28": 55, - "29": 235, - "30": 9, - "31": 81 - }, - "index": 63, - "account": "0xfaC9EA89bB4d1786FDb19D95f328A373217aa9D7", - "proof": [ - "0x29f8f9607b0797eaa36b2cad4675c663ac9a1e70ab192021974955f8ae2a7821", - "0x523cd54ef9e83351761619616255c7891d9b11c1ab5c1e48531f00e3f53bb7e6", - "0x3e7c6648ca3318e8b4f95e8de1bd6ec267ba0db4912f63b5441d93664b7d4d98", - "0x153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1", - "0xbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6", - "0x547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4", - "0x653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d" - ] - }, - { - "v": 28, - "r": { - "0": 252, - "1": 33, - "2": 98, - "3": 15, - "4": 57, - "5": 202, - "6": 189, - "7": 17, - "8": 7, - "9": 9, - "10": 70, - "11": 200, - "12": 63, - "13": 154, - "14": 208, - "15": 82, - "16": 87, - "17": 111, - "18": 242, - "19": 159, - "20": 78, - "21": 200, - "22": 86, - "23": 37, - "24": 6, - "25": 47, - "26": 79, - "27": 217, - "28": 207, - "29": 106, - "30": 176, - "31": 133 - }, - "s": { - "0": 101, - "1": 149, - "2": 77, - "3": 223, - "4": 22, - "5": 88, - "6": 234, - "7": 8, - "8": 32, - "9": 40, - "10": 80, - "11": 238, - "12": 184, - "13": 159, - "14": 58, - "15": 65, - "16": 32, - "17": 22, - "18": 247, - "19": 30, - "20": 25, - "21": 151, - "22": 121, - "23": 68, - "24": 216, - "25": 144, - "26": 225, - "27": 107, - "28": 1, - "29": 234, - "30": 90, - "31": 117 - }, - "index": 66, - "account": "0xbb03051f1fDeCbb825774403649665397769faf8", - "proof": [ - "0x7c503325f216aff7904236623cdb883af537524fa41d58235aba2c87e971965a", - "0x41b4c0d6017972621c54c7dc959908c6a7035f17e81c8ca2200bdd509beec39c", - "0xdd06e6dabf4d10f83d7f4f8d91b7d8029d92f619d48f76b3f6008ca9006c8bef", - "0xc64fbe72de8cc7b9397406e0de664c63b9fac1ab2a1dfa8829f990bdf2484e6b", - "0x2586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2b" - ] - }, - { - "v": 28, - "r": { - "0": 242, - "1": 148, - "2": 182, - "3": 209, - "4": 163, - "5": 6, - "6": 167, - "7": 191, - "8": 54, - "9": 1, - "10": 162, - "11": 155, - "12": 216, - "13": 184, - "14": 183, - "15": 105, - "16": 113, - "17": 54, - "18": 190, - "19": 74, - "20": 222, - "21": 183, - "22": 225, - "23": 10, - "24": 54, - "25": 31, - "26": 166, - "27": 228, - "28": 50, - "29": 42, - "30": 239, - "31": 195 - }, - "s": { - "0": 68, - "1": 90, - "2": 131, - "3": 84, - "4": 210, - "5": 5, - "6": 157, - "7": 128, - "8": 175, - "9": 253, - "10": 227, - "11": 76, - "12": 207, - "13": 46, - "14": 247, - "15": 149, - "16": 65, - "17": 235, - "18": 219, - "19": 4, - "20": 83, - "21": 236, - "22": 173, - "23": 63, - "24": 113, - "25": 3, - "26": 194, - "27": 175, - "28": 2, - "29": 156, - "30": 171, - "31": 18 - }, - "index": 70, - "account": "0x177F562c6aDbf70046728ebcC286A6AC580cDcA2", - "proof": [ - "0xbd12e10220fdebc1d01da687a593b144f8b7029ef2060789635bc56289166171", - "0x1443397d832242fd62137ab750b5c65064fbef25bfa526b29914d123a5b129e8", - "0xfb8d08773869ebbe2e15f561f06c83a7d905e61cdefdc7b195f01a3c03452f1a", - "0xc64fbe72de8cc7b9397406e0de664c63b9fac1ab2a1dfa8829f990bdf2484e6b", - "0x2586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2b" - ] - } - ], - "finalValidatorsProofRaw": "0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000011800000000000000000000000000000000000000000000000000000000000001340000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000018800000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001dc00000000000000000000000000000000000000000000000000000000000001f800000000000000000000000000000000000000000000000000000000000002140000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000024c0000000000000000000000000000000000000000000000000000000000000268000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002f4000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000001cd1537acdc77a060912ced5fff892b0f2d69785c894ca08ac8301eb2042cd694831cdf96897dd48ed661ecc76979716f2920926338730fd956f6abe9fec1b9e20000000000000000000000000000000000000000000000000000000000000000100000000000000000000000055e18e8c6ed1b12f220826e0279b60985de0f2b700000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000079f638d4795a7a68d02dda9c7029e9fa392658bdd9c2ec6670298d73c95ce6e970ddae405dc19ebec4a340811f1eaa8d1e2fde2902722839c252c46622c230dd9ecca7e49c86e7184782e17c6414f3725d72dd49cf8f074b0080b65dbffb708bba6d711e88370aadeeefc420a6f2c5dc4dd87a885f70d3c9ca65768ade41c483a2ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b89cc042c48d1f218094fcf128b4c80c3e84c8d97f143067b94fb30777ab616b07a249c2d95972abdf0a2b14b4b6bc4dbc69ee53ea5f8635fcc012d63f039339a0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000ba6705c26ee930eff285283939e588f574b7eda400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007fd869da58bcdcc433436cb281fbdb10e6ab48bc4d0f45eaf2f81cdccfaa621cf42d9ed32d1eafb57bda9732004ada71bebad93f8b86988d3d21e42589f89c6618970c381942a5e0bb57b7b254d06ccb5627f6f062252711b52a16245c640830baf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed42ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b70ae56d5d0ef60dae0cf0721d62eabddae11ecd3281b397fafe1f7314b82db793691e1438c67f867938ef44c1b45d6c18a9d08f937134add51c83e0e0600467900000000000000000000000000000000000000000000000000000000000000090000000000000000000000004c88d475766e01fe7db288e8949e8fbaec90b52300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007f2e5b9bec3c1f02022e7d8170ee87089057e17d02b4640671fc3f70c0c3bf6e842d9ed32d1eafb57bda9732004ada71bebad93f8b86988d3d21e42589f89c6618970c381942a5e0bb57b7b254d06ccb5627f6f062252711b52a16245c640830baf7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed42ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bdc6b6945876f6b3f1fbba28ac5eac193046918906a2098ee2403b99cf108ee8830a4665f85398f9f1012637b8ae8fc020baa0f943bbcc80da512279c77cf4c0e000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000cea94bb26f6a706248f372eab9c5e932a8bf461700000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000071bb4f435c3b4b89bdfba70c5793028dc3d51c70fc44ea5ac42b7bf30c7a1c12b10a6a04620439420509dd181df6aeb01ec222e93ab257afd7e6ae8dd82540f1116e976b460155c4453c0c60e9f1a4f47ef620beb3882a9aed4af6564d99076d0af7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed42ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bc1c2020812d024e7ce1eb69e1180de9df695dd0eff2e6d3c34e4205864ed54fe03a9b9502f0aec114c628e5ca2ff87dc9744275f99f36ca0dc8e15b87f4d5546000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000ba347abdd8fc2fa86227a0249c0bac0eac5dbffd00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000702554d891e5d1d29838dd67f120dc601d2a9af5db3aa46d4f0597df94ce15017f33e999f73f666fbb0521c18262c9cb12b17dc7336acc35ffcd539799217e31316e976b460155c4453c0c60e9f1a4f47ef620beb3882a9aed4af6564d99076d0af7f40e7f721f43293cec3b931fa8c4915c86b527828a08df66c56e44cb34ed42ace419b9eaa7e14a0cbbc3ebbb113ebf5b36eaaa7bc3cae90cba30d1b7473118c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b5fa58aa03ca9c41724741ed11cf9164267f5e14760376cf1b4b041363781443845cf98f0c210dbc56467332c62a4859707f058aad72bd059bb5e7c17f6f9222e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000007bd970810445290ef6b0d05c7f3e0f801cdad8a900000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007718c9b5ce50b808883dc04947b051e3bef2ef0425dc132debbac5bb8d6087f44b11ccc23573a5958843aa903d1d0188ea7fc5f6bcf27e8c84eaebefb70f543665e4e72c113a324ef77787fd287e646b2e0ad5ab9ae80979db0e3095edbbc5d5eca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936edf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b1d0dc78c15843ee56b3145d4a73b3fb892a31df1803af967bea4bc0053009a9460864d47a77b48fc24664198bed43396a3a14fee39054bef42da080132d5582a0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000e89f1d28601bbe5e99a0db247b6d3b35fb02f9c500000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000075ba8ed0f8785e5666b7c442021ce7983f00921920d8478d55ed1e1c2e2425ebcb11ccc23573a5958843aa903d1d0188ea7fc5f6bcf27e8c84eaebefb70f543665e4e72c113a324ef77787fd287e646b2e0ad5ab9ae80979db0e3095edbbc5d5eca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936edf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c9593c2e499b0fada47b7386775f6cc7fb6aae4d17c4f540ba6d0e24b0b89e5417c0a3ef2b878982c1a24571f64de2df92e4b64ffe8368ed7242df597ef247a350000000000000000000000000000000000000000000000000000000000000015000000000000000000000000638a0850daffe6358aa80b8ae98ad0ec25061d4b00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000071c8e06d7b1687ffe2abba0cffcae8b39a0ec9a6a1f0f05992dfc06b756a4d771bbd75e40a5be8a6d964cb21e7d93a51af457266721ba0d82e446f32a255119edb870df94a423e3dfabd590045ba955d86795c8b5795d6388b898e3cbde24bdb6ca3c12bf5a4017887fc4cf5f7710b028cdd6bcdfe1ad9edb23a848fb077a936edf9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c0c0e190d218c9ada36a3101f49749a95d80e6795757b71411291e61dabfefcd07b925ef140ba5f0d54bcdf50544f6861d03f0798b7508dcf8f439de24178e3b400000000000000000000000000000000000000000000000000000000000000190000000000000000000000006897b2bc599b856b971a29b79392a81727aea31200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007d42355ceea991b5e798f4848ad9b651f1f0785a79f38ca7719e9883b381d34cb3f47490c4bc88013808223b15d34755117ecc6b07b2bd5f0b970b034a40a0be4061bad1f99006db82b8189a8d4bcc96d6c3667336ba181acad98164ce6f114ed325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4df9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bcd0a5d3af965a04fc0d60ac39d8b10048f2a8e0842a67740ba91a06a6415b4f53bbf81e8eed9681080237872bc8f104cd93f2189549c9f98a3fd0bb49b57699b000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000c122fa8524ae9897e0a0a788effa8dc149dd64d100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007f9705dd39c128105e60edee073f61a6709b14346aa654b4a5cb34388b66c16916ba91e46bd096f6e8b72c0fb921ec85fc08cd3fb2853a6579cb0130190328c50061bad1f99006db82b8189a8d4bcc96d6c3667336ba181acad98164ce6f114ed325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4df9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b343aa18f9e1dd094f950f83dfcd41cf39a35596a8ceef34a387a84126f543d736bb5218acad21896b78dc7c9483a4b31ca4e1831347963382e0f3ce82d735bc5000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000f9bf1ade364193268c3fd151e3e68796249c912e00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007a7cb4572bf2962bb133980eb844b4997f8c098f09d9672e0af8e33777a0ef0926ba91e46bd096f6e8b72c0fb921ec85fc08cd3fb2853a6579cb0130190328c50061bad1f99006db82b8189a8d4bcc96d6c3667336ba181acad98164ce6f114ed325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4df9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c9153ec4b204c4b5850ac68b9a67f4908665276bdee099dc167cadd10947381cf3392c9c418b458b09118432d8488705feda64874f6d7a805e91af8debfd91c97000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000005f6e1df54540035e8117436953b6e551179fc67800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007387f1f7945c59ff550cf4a3d1d66136d529b21817110b514ead2aeef3abf12ebf8ce7254a333528d4e83af789e3758b74b6ac37d0272d6795a6eeb4c4394f17a7126a8044f997db28aaf469f8f66a8a4c09c25ab03c0b902bf02618d54d5e86e325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4df9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b44bfedfa4af6c63188d7e91a4ca6d878eaffae489330030fc65bec17ad0510c9154c144359af2c4ae4a9052602c7a9dc87ab937bb5e5ba50b27103e5e78d15d7000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000005473090d3a9d7b984b31f2d36f2d004a9188796d00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000072d3fe5fcf7e9b1559b73b0055d813911a135fd0f7311e5a69899cf420c418c9f8df6a7abbefe9b2fe4e384876b71ec1eb90d23950c68b78df4e22909590d19307126a8044f997db28aaf469f8f66a8a4c09c25ab03c0b902bf02618d54d5e86e325666c5a681388f68098fa3270d9f8b05de0c3a929cf61ce2fff465db97ffa4df9973cc4b389edb18d204fb23baa094715a7f530e120a19fd643bd338f242ed8c83332339cab7a6008352495919f7102dbe1cc4d6d243682565de39b33d4899653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b3f6bffc308c3a898b84875959cc20660c263613fdbdfcab7d80b7a5085aa96ee39ef399ad9787988feb9725190c75a77a97c529183c880f36d4c92f70ddefa4e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000007165efa8a63155a662aa5781ea58b91b2725393200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007fb134026186c34bd460714bae0e8658c3b324b0b57a76d10cb405e21cc218633b71a43f8fcffdd983ac18f7c5dbcd69e6aa3e203a9ce09d40a5234e1925153dd8ef3bfbae8f9b410d233cdfe5d7e21a5efa8b14e8101924058008818e14b60799a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c83cb96ab3d0b13523992b050aabad6c626a8343af0d3eee72b7d6b30b39b6191302f2b4df395120b6d42cf7d9b93026302b7720b992c49742c2f58cb70a3df4800000000000000000000000000000000000000000000000000000000000000220000000000000000000000000bfc283b4769560580ecc8e1ac10746b3bd9aca400000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007cbd43c389a6eff6fac6d5d3d24807e3bb10cdcb6b09d4b53268414d3b8974e9aa2db25aa7057e89d4f0e866cbdd150b76f94e4de7669320568f538a98c84388d8ef3bfbae8f9b410d233cdfe5d7e21a5efa8b14e8101924058008818e14b60799a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b6493d3940b5e813e87ec3e3d113def19bdfd2c5f19f49b5785cbfc7686067b6d71837f7c94fc3bb688b1cc5a71c7761344dc4f80da3515ce06a0cdcb683a034400000000000000000000000000000000000000000000000000000000000000240000000000000000000000008713ffec5c23955193bdbaa94c43e43091673b5f00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000796bb7448b75bc9288b782a3a15ed3a7e04be7232693dbadfa1c4b58b6f6fe3122d473663ea72fa4448c4f0ac34ca65f2786dddea9e86e3986d3ef6744a99d25baa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bedbf131551b80119a7c70844df4a1587373d9bef53111d3472077bc4dcd20f5058c3d85c85b08aedbb6af09f430981a2e3c7e0cab1dbd5246ea617a791b2cadc00000000000000000000000000000000000000000000000000000000000000250000000000000000000000008efb8e804f959f723a26ae7e1f2d6a55f2bf4b0100000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000072b720bc8c7bd65302d3a9b6ed95709a5bdfffaa89f12a1b5d43905289c7d413f2d473663ea72fa4448c4f0ac34ca65f2786dddea9e86e3986d3ef6744a99d25baa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bff44c96097f7ca500ad886d90ff78a60aa3752ad813db083043c54ce0ab53e373367a298359c37df40868347529aed4f920083429cde72cbcab052fceda76b7c00000000000000000000000000000000000000000000000000000000000000260000000000000000000000006f57c6389c53ce81a689270533c4b44258feac7300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007cc2df11e3c69dffcc8187127a3b334432dc29635d2e5243aa5f8814a49dfb2339f28aef3ff250b849a119017971362e72cc6a981641230be766c00927bec6362aa641c5b1c4bc90b917cf33bdcb137ae27c5346bad7d7f998300d56c72f362dc9a35c0781f39c88b0b0b3e32ebf43c433de23ab6ee7884a74afee67de4d355e8df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c1c736aba366c495ef890f85e7ac844af0aa05896ad50daf803d513b271d5f6a711ae0657313a6073cd6497560c8c94083df169e84e2551860fedea0d63a79b96000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000006742544686e53f20af2c142cc16237a00c73de8a00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007ca98d350b190c5eccb37aa15728b19144c9759d396285a4e7f2a28c7809c8ebade649342947e1988655c618763d70685a13df42aa865cf359589548bc23a2a3edf87aa78616553aa20706bacdbbdd36e1144798c2856e10cdd4499faa7736c821c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bf93b32a7da38be03e6cc3a6458c9840680738f318947bf79947542c464d1939a66e1f13af83c02cc741994d94bf6f69e70ebe6a556e62a0688ce0f3fb79e6b42000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000001816545f1ec96a0dc86f507a269af7663d2982ac00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007520952d6f00e3741a5575c0f7f2090cd719216dbb3ced9d5c21c24dbce285798f40fe0fd52f06a2d6094f3decbbeb75424bf1ae7cb1e749f2950a0af77aa1dc53353786e8802d17d7b68581269cc7c782705a4fdb918a4a2973bfc4e7ec9e0a71c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c4d41d5daf0d6def2e6f39ce7f39d268280dfd809470451db0aa1f06e47ced1425f465e998a512de3d9ac6ecf5d9d203a177d39aea60fcb57da0c4e1373e0a08f000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000a34e066ba08f8fd62395faea13a32479593642300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000072dc32d91b583f563e8cc5fc3955eb9dacbca98a92a26765ca9e7e8954027595784ac7649882c9a452a02c49e4514ca792334eec158702060122e54f7853e0a353353786e8802d17d7b68581269cc7c782705a4fdb918a4a2973bfc4e7ec9e0a71c2ea3192cb5f9cb94f8ad8cd8cfd06dea766d04229dc44dc1bb03c8bdfcb514df1e9fb44d371a946a5aa702e9a25cafbe86baebef308c2ece39e05700478e04547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c84cecc6117f99f70c5146be1635aca7381c218f17b28200571110eeb051f86ce6cceab08c4dfe5f14192940adb6a4e54f3728d85a314bff8f8b8869327329f780000000000000000000000000000000000000000000000000000000000000031000000000000000000000000e1b54fe1ce501b582c4e9bb0df1637730fb7af9100000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007cdbcffc7df03d81faa7348cc74f9ee6d67f4ec8275c20b9b225ac1ee04e80d64c1bfe7aae1ec8d84327846f6acfa72c4133d33d5eb410d8ec99b9f35fd3939881f613d9f7e71d7dc4c307193b8d42896328a73e053cfe6a6e4cc786c10e43296a27b84005396060df67c11bed4504cdb87cf1ea758f6f4a140cb29494a087a4fbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001b3dabeab6beb63d93d776080a3437f6003fea7b2d2accfcd33bf019648c25eb20251591b8cd27c1b42d76b797756d961b9aea0f917405f8db5744fab5d80b49c400000000000000000000000000000000000000000000000000000000000000330000000000000000000000002f1c6f5fcd931c27e1b2306852e21aca92fec6c500000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000079dccf3e45bea61fa594ba6e5d230fcc2421a38989251fba2e8bbc874cb420e414886bae121d2ce619dfd57e50df1edbdae59ff35dd8c2eabe61d5a99bdf4cef41f613d9f7e71d7dc4c307193b8d42896328a73e053cfe6a6e4cc786c10e43296a27b84005396060df67c11bed4504cdb87cf1ea758f6f4a140cb29494a087a4fbacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001bd507989b815920e58c3867e4d6cd96ac31673af1cf019dbeb70a38c6ed741e842bda5744c2d89eefb3c911c65e8ba1c51f88b7513f294a56a3c5446a9077e16b00000000000000000000000000000000000000000000000000000000000000380000000000000000000000003dae00899e4f81e2b447b39a3cff0ea4a8bc327300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000078c53e866a7ff52b8836810ea084a42336d638792ceca9ddb84429b690a9e0a0ee7dd43698a3723e9471ba1b10e3da11e19653c87a12c4877b1ecc1b58bc992537b3707c9f2cd7dcf94982da6bc7804f76623dadb493a19af67eda93f05c37b7b153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1bacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c7b0d15b9c41cd7daad215d24cb61d776caa1bbbd571c63a0a97aeaecc0b493cd632ada06483dbe354036d70f976ae26739300ed095ace99d8ee568eace5942eb0000000000000000000000000000000000000000000000000000000000000039000000000000000000000000c2f3a90c603796c7fb18f7c185253833390ef45500000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000007befd3fbde8993fc839ab3f147ca9f05c95c8abfdba6f0711699de8ce6625c854e7dd43698a3723e9471ba1b10e3da11e19653c87a12c4877b1ecc1b58bc992537b3707c9f2cd7dcf94982da6bc7804f76623dadb493a19af67eda93f05c37b7b153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1bacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001c085c7a68d251a6227e693bed7e79178cdbbe2e6b89e4f6d33f1895d8f32c801f0afcab0f0d63f340897889f9cbeaa7f2a00be85a2f5a1993e9deb0a237eb0951000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000fac9ea89bb4d1786fdb19d95f328a373217aa9d700000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000729f8f9607b0797eaa36b2cad4675c663ac9a1e70ab192021974955f8ae2a7821523cd54ef9e83351761619616255c7891d9b11c1ab5c1e48531f00e3f53bb7e63e7c6648ca3318e8b4f95e8de1bd6ec267ba0db4912f63b5441d93664b7d4d98153bb75202d1c29ebe7aeae6a94fbefeba0eda3b9811dc8d49076b7d2a26b2e1bacd6f486c4af7f9a8544d4de5d1f204138a0b5be9ee1cef7a46d0e8088251e6547d2f4bce7e91a3ac513e803257445a67bda0fa0490624ff82709ad9f14fbc4653a2b0a2760626f7381e8fb2e962ac1c11a943b21cdd8dbfe376b1b285b745d000000000000000000000000000000000000000000000000000000000000001cfc21620f39cabd11070946c83f9ad052576ff29f4ec85625062f4fd9cf6ab08565954ddf1658ea08202850eeb89f3a412016f71e19977944d890e16b01ea5a750000000000000000000000000000000000000000000000000000000000000042000000000000000000000000bb03051f1fdecbb825774403649665397769faf800000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000057c503325f216aff7904236623cdb883af537524fa41d58235aba2c87e971965a41b4c0d6017972621c54c7dc959908c6a7035f17e81c8ca2200bdd509beec39cdd06e6dabf4d10f83d7f4f8d91b7d8029d92f619d48f76b3f6008ca9006c8befc64fbe72de8cc7b9397406e0de664c63b9fac1ab2a1dfa8829f990bdf2484e6b2586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2b000000000000000000000000000000000000000000000000000000000000001cf294b6d1a306a7bf3601a29bd8b8b7697136be4adeb7e10a361fa6e4322aefc3445a8354d2059d80affde34ccf2ef79541ebdb0453ecad3f7103c2af029cab120000000000000000000000000000000000000000000000000000000000000046000000000000000000000000177f562c6adbf70046728ebcc286a6ac580cdca200000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000005bd12e10220fdebc1d01da687a593b144f8b7029ef2060789635bc562891661711443397d832242fd62137ab750b5c65064fbef25bfa526b29914d123a5b129e8fb8d08773869ebbe2e15f561f06c83a7d905e61cdefdc7b195f01a3c03452f1ac64fbe72de8cc7b9397406e0de664c63b9fac1ab2a1dfa8829f990bdf2484e6b2586b1acf8187086c42dd317785c79d85fb281987845a982517a5925ff9c7b2b" -} \ No newline at end of file diff --git a/overridden_contracts/test/data/beefy-validator-set.json b/overridden_contracts/test/data/beefy-validator-set.json deleted file mode 100644 index 3da9b61..0000000 --- a/overridden_contracts/test/data/beefy-validator-set.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "validatorSetSize": 73, - "participants": [ - 0, - 1, - 2, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 18, - 19, - 21, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 32, - 34, - 36, - 37, - 38, - 41, - 42, - 44, - 45, - 46, - 49, - 50, - 51, - 52, - 53, - 55, - 56, - 57, - 59, - 60, - 61, - 63, - 66, - 67, - 69, - 70 - ], - "absentees": [ - 3, - 4, - 5, - 6, - 15, - 16, - 17, - 20, - 22, - 33, - 35, - 39, - 40, - 43, - 47, - 48, - 54, - 58, - 62, - 64, - 65, - 68, - 71, - 72 - ], - "validatorRoot": "0x266b138f96d4445dfd9a6329b03beffc23cb949b14d8f63d70e15e57c78b31a4" -} \ No newline at end of file diff --git a/overridden_contracts/test/data/mmr-fixture-data-15-leaves.json b/overridden_contracts/test/data/mmr-fixture-data-15-leaves.json deleted file mode 100644 index ae6c11d..0000000 --- a/overridden_contracts/test/data/mmr-fixture-data-15-leaves.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "leaves": [ - "0x11da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9", - "0xe12c22d4f162d9a012c9319233da5d3e923cc5e1029b8f90e47249c9ab256b35", - "0x7b0aa1735e5ba58d3236316c671fe4f00ed366ee72417c9ed02a53a8019e85b8", - "0x8c039ff7caa17ccebfcadc44bd9fce6a4b6699c4d03de2e3349aa1dc11193cd7", - "0x26a08e4d0c5190f01871e0569b6290b86760085d99f17eb4e7e6b58feb8d6249", - "0x8c35d22f459d77ca4c0b0b5035869766d60d182b9716ab3e8879e066478899a8", - "0xf4aac2fbe33f03554bfeb559ea2690ed8521caa4be961e61c91ac9a1530dce7a", - "0x5b8f29db76cf4e676e4fc9b17040312debedafcd5637fb3c7badd2cddce6a445", - "0x9dff876a4b942d0a9711d18221898f11ca39751589ebf4d49d749f6b3e493292", - "0x2f016b7a5db930dabdea03aa68d2734d2fa47a0557e20d130cc1e044f8dc5796", - "0x2c088bf3b4e7853c99e49636d9e7c9a351918d70bd6cdf6148b81e68f5706f68", - "0xd86b397901605eef0229e0598759a8984f13c8d62b040e194fc5da975fd7d26e", - "0xc7856cb5ae12a2894083db901119ee630c3cd37725716a98a446a3f2476ecd73", - "0xd730b9b18f000e2d67b09eac611eda5bbdef729872387b80d989a4f10f833c56", - "0xe368a18dde7eb682dafa880806aba8df888a8653fa0b0bf4f0f90cb69f49f1d9" - ], - "rootHash": "0x362b201244f8ec314f4995918ac70a19ba818d4d41e78c9634ff6d281af3c4c1", - "proofs": [ - { - "items": [ - "0xe12c22d4f162d9a012c9319233da5d3e923cc5e1029b8f90e47249c9ab256b35", - "0x513bf90be61a0fa9099a23510fc22436cf364f837d7d455fc6b13903874e98b9", - "0xc540f6cc8db70e3f37bf564d202563d3d323b761f97bb1bf44b85c48f8f38a16", - "0x6cec581ba72ef0a8b48c0a05fa9dc904775032adadbac83d10b2dbdf05a2f8a7" - ], - "order": 8 - }, - { - "items": [ - "0x11da6d1f761ddf9bdb4c9d6e5303ebd41f61858d0a5647a1a7bfe089bf921be9", - "0x513bf90be61a0fa9099a23510fc22436cf364f837d7d455fc6b13903874e98b9", - "0xc540f6cc8db70e3f37bf564d202563d3d323b761f97bb1bf44b85c48f8f38a16", - "0x6cec581ba72ef0a8b48c0a05fa9dc904775032adadbac83d10b2dbdf05a2f8a7" - ], - "order": 9 - }, - { - "items": [ - "0x8c039ff7caa17ccebfcadc44bd9fce6a4b6699c4d03de2e3349aa1dc11193cd7", - "0xacd5fdc9438204fb30c9154587515c2d12d1e5da66bc4f766be92319504443c1", - "0xc540f6cc8db70e3f37bf564d202563d3d323b761f97bb1bf44b85c48f8f38a16", - "0x6cec581ba72ef0a8b48c0a05fa9dc904775032adadbac83d10b2dbdf05a2f8a7" - ], - "order": 10 - }, - { - "items": [ - "0x7b0aa1735e5ba58d3236316c671fe4f00ed366ee72417c9ed02a53a8019e85b8", - "0xacd5fdc9438204fb30c9154587515c2d12d1e5da66bc4f766be92319504443c1", - "0xc540f6cc8db70e3f37bf564d202563d3d323b761f97bb1bf44b85c48f8f38a16", - "0x6cec581ba72ef0a8b48c0a05fa9dc904775032adadbac83d10b2dbdf05a2f8a7" - ], - "order": 11 - }, - { - "items": [ - "0x8c35d22f459d77ca4c0b0b5035869766d60d182b9716ab3e8879e066478899a8", - "0x60b009cbbcffec54322b2eb04765e7209c0dbf5fcbd15eb2068b9fd03389a05c", - "0xb5d6bae5432161e6ce0fdfd28ea26011f581ad68335e77cf68864f4911879257", - "0x6cec581ba72ef0a8b48c0a05fa9dc904775032adadbac83d10b2dbdf05a2f8a7" - ], - "order": 12 - }, - { - "items": [ - "0x26a08e4d0c5190f01871e0569b6290b86760085d99f17eb4e7e6b58feb8d6249", - "0x60b009cbbcffec54322b2eb04765e7209c0dbf5fcbd15eb2068b9fd03389a05c", - "0xb5d6bae5432161e6ce0fdfd28ea26011f581ad68335e77cf68864f4911879257", - "0x6cec581ba72ef0a8b48c0a05fa9dc904775032adadbac83d10b2dbdf05a2f8a7" - ], - "order": 13 - }, - { - "items": [ - "0x5b8f29db76cf4e676e4fc9b17040312debedafcd5637fb3c7badd2cddce6a445", - "0x2fc249826fa000037981cc3446a7e0ad347c8446525dc7958723ea3afc7209de", - "0xb5d6bae5432161e6ce0fdfd28ea26011f581ad68335e77cf68864f4911879257", - "0x6cec581ba72ef0a8b48c0a05fa9dc904775032adadbac83d10b2dbdf05a2f8a7" - ], - "order": 14 - }, - { - "items": [ - "0xf4aac2fbe33f03554bfeb559ea2690ed8521caa4be961e61c91ac9a1530dce7a", - "0x2fc249826fa000037981cc3446a7e0ad347c8446525dc7958723ea3afc7209de", - "0xb5d6bae5432161e6ce0fdfd28ea26011f581ad68335e77cf68864f4911879257", - "0x6cec581ba72ef0a8b48c0a05fa9dc904775032adadbac83d10b2dbdf05a2f8a7" - ], - "order": 15 - }, - { - "items": [ - "0x2f016b7a5db930dabdea03aa68d2734d2fa47a0557e20d130cc1e044f8dc5796", - "0x36281825b6421a270a10f1bfd6118c157b514ce9a1846d14e2e6fb5ed0b3b375", - "0x35c62a00ad66ad55def21872288bf816dd906bc8c6527ae40d6d77237823dbd9", - "0xc1361eba57563421bf7465b7bf2bae5619dedd606aae7374d1cbd554335c1005" - ], - "order": 4 - }, - { - "items": [ - "0x9dff876a4b942d0a9711d18221898f11ca39751589ebf4d49d749f6b3e493292", - "0x36281825b6421a270a10f1bfd6118c157b514ce9a1846d14e2e6fb5ed0b3b375", - "0x35c62a00ad66ad55def21872288bf816dd906bc8c6527ae40d6d77237823dbd9", - "0xc1361eba57563421bf7465b7bf2bae5619dedd606aae7374d1cbd554335c1005" - ], - "order": 5 - }, - { - "items": [ - "0xd86b397901605eef0229e0598759a8984f13c8d62b040e194fc5da975fd7d26e", - "0x803e1ef975318b622e5ffc8b3a5856201e1c53827952c720e3a87d3ffc1bbdf2", - "0x35c62a00ad66ad55def21872288bf816dd906bc8c6527ae40d6d77237823dbd9", - "0xc1361eba57563421bf7465b7bf2bae5619dedd606aae7374d1cbd554335c1005" - ], - "order": 6 - }, - { - "items": [ - "0x2c088bf3b4e7853c99e49636d9e7c9a351918d70bd6cdf6148b81e68f5706f68", - "0x803e1ef975318b622e5ffc8b3a5856201e1c53827952c720e3a87d3ffc1bbdf2", - "0x35c62a00ad66ad55def21872288bf816dd906bc8c6527ae40d6d77237823dbd9", - "0xc1361eba57563421bf7465b7bf2bae5619dedd606aae7374d1cbd554335c1005" - ], - "order": 7 - }, - { - "items": [ - "0xd730b9b18f000e2d67b09eac611eda5bbdef729872387b80d989a4f10f833c56", - "0xe368a18dde7eb682dafa880806aba8df888a8653fa0b0bf4f0f90cb69f49f1d9", - "0x36b462267ff011c828695dd8f7cb808f57260d3ac64de0ed305544411b4603a9", - "0xc1361eba57563421bf7465b7bf2bae5619dedd606aae7374d1cbd554335c1005" - ], - "order": 2 - }, - { - "items": [ - "0xc7856cb5ae12a2894083db901119ee630c3cd37725716a98a446a3f2476ecd73", - "0xe368a18dde7eb682dafa880806aba8df888a8653fa0b0bf4f0f90cb69f49f1d9", - "0x36b462267ff011c828695dd8f7cb808f57260d3ac64de0ed305544411b4603a9", - "0xc1361eba57563421bf7465b7bf2bae5619dedd606aae7374d1cbd554335c1005" - ], - "order": 3 - }, - { - "items": [ - "0x6fa53c683590167b996abcab0e9d911f68505ec187e329aa1ac1deb2d17b795a", - "0x36b462267ff011c828695dd8f7cb808f57260d3ac64de0ed305544411b4603a9", - "0xc1361eba57563421bf7465b7bf2bae5619dedd606aae7374d1cbd554335c1005" - ], - "order": 0 - } - ] -} diff --git a/overridden_contracts/test/mocks/MockOGateway.sol b/overridden_contracts/test/mocks/MockOGateway.sol deleted file mode 100644 index e4299c6..0000000 --- a/overridden_contracts/test/mocks/MockOGateway.sol +++ /dev/null @@ -1,91 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity 0.8.25; - -import {ParaID, OperatingMode} from "../../src/Types.sol"; -import {CoreStorage} from "../../src/storage/CoreStorage.sol"; -import {Verification} from "../../src/Verification.sol"; -import {IInitializable} from "../../src/interfaces/IInitializable.sol"; -import {UD60x18} from "prb/math/src/UD60x18.sol"; - -import {Gateway} from "../../src/Gateway.sol"; - -contract MockOGateway is Gateway { - bool public commitmentsAreVerified; - - constructor( - address beefyClient, - address agentExecutor, - ParaID bridgeHubParaID, - bytes32 bridgeHubHubAgentID, - uint8 foreignTokenDecimals, - uint128 maxDestinationFee - ) - Gateway(beefyClient, agentExecutor, bridgeHubParaID, bridgeHubHubAgentID, foreignTokenDecimals, maxDestinationFee) - {} - - function agentExecutePublic(bytes calldata params) external { - this.agentExecute(params); - } - - function createAgentPublic(bytes calldata params) external { - this.createAgent(params); - } - - function upgradePublic(bytes calldata params) external { - this.upgrade(params); - } - - function createChannelPublic(bytes calldata params) external { - this.createChannel(params); - } - - function updateChannelPublic(bytes calldata params) external { - this.updateChannel(params); - } - - function setOperatingModePublic(bytes calldata params) external { - this.setOperatingMode(params); - } - - function transferNativeFromAgentPublic(bytes calldata params) external { - this.transferNativeFromAgent(params); - } - - function setCommitmentsAreVerified(bool value) external { - commitmentsAreVerified = value; - } - - function _verifyCommitment(bytes32 commitment, Verification.Proof calldata proof) - internal - view - override - returns (bool) - { - if (BEEFY_CLIENT != address(0)) { - return super._verifyCommitment(commitment, proof); - } else { - // for unit tests, verification is set with commitmentsAreVerified - return commitmentsAreVerified; - } - } - - function setTokenTransferFeesPublic(bytes calldata params) external { - this.setTokenTransferFees(params); - } - - function setPricingParametersPublic(bytes calldata params) external { - this.setPricingParameters(params); - } - - function registerForeignTokenPublic(bytes calldata params) external { - this.registerForeignToken(params); - } - - function mintForeignTokenPublic(bytes calldata params) external { - this.mintForeignToken(params); - } - - function transferNativeTokenPublic(bytes calldata params) external { - this.transferNativeToken(params); - } -} diff --git a/overridden_contracts/test/override_test/Gateway.t.sol b/overridden_contracts/test/override_test/Gateway.t.sol deleted file mode 100644 index c04eca2..0000000 --- a/overridden_contracts/test/override_test/Gateway.t.sol +++ /dev/null @@ -1,655 +0,0 @@ -//SPDX-License-Identifier: GPL-3.0-or-later - -// Copyright (C) Moondance Labs Ltd. -// This file is part of Tanssi. -// Tanssi is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// Tanssi is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// You should have received a copy of the GNU General Public License -// along with Tanssi. If not, see -pragma solidity 0.8.25; - -import {Test, console2, Vm} from "forge-std/Test.sol"; -import { - AgentExecuteCommand, - InboundMessage, - OperatingMode, - ParaID, - ChannelID, - Command, - multiAddressFromBytes32, - multiAddressFromBytes20 -} from "../../src/Types.sol"; -import {IGateway} from "../../src/interfaces/IGateway.sol"; -import {IMiddlewareBasic} from "../../src/interfaces/IMiddlewareBasic.sol"; -import {MockGateway} from "../mocks/MockGateway.sol"; -import { - CreateAgentParams, - CreateChannelParams, - SetOperatingModeParams, - RegisterForeignTokenParams -} from "../../src/Params.sol"; -import {OperatingMode, ParaID, Command} from "../../src/Types.sol"; -import {GatewayProxy} from "../../src/GatewayProxy.sol"; -import {MultiAddress} from "../../src/MultiAddress.sol"; -import {AgentExecutor} from "../../src/AgentExecutor.sol"; -import {Verification} from "../../src/Verification.sol"; - -import {Strings} from "openzeppelin/utils/Strings.sol"; - -import {Gateway} from "../../src/Gateway.sol"; -import {IOGateway} from "../../src/interfaces/IOGateway.sol"; -import {Operators} from "../../src/Operators.sol"; -import {Assets} from "../../src/Assets.sol"; -import {MockOGateway} from "../mocks/MockOGateway.sol"; -import {Token} from "../../src/Token.sol"; -//NEW -import {WETH9} from "canonical-weth/WETH9.sol"; -import {UD60x18, ud60x18, convert} from "prb/math/src/UD60x18.sol"; - -contract GatewayTest is Test { - // Emitted when token minted/burnt/transfered - event Transfer(address indexed from, address indexed to, uint256 value); - - ParaID public bridgeHubParaID = ParaID.wrap(1013); - bytes32 public bridgeHubAgentID = 0x03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314; - address public bridgeHubAgent; - - ParaID public assetHubParaID = ParaID.wrap(1000); - bytes32 public assetHubAgentID = 0x81c5ab2571199e3188135178f3c2c8e2d268be1313d029b30f534fa579b69b79; - address public assetHubAgent; - - address public relayer; - - bytes32[] public proof = [bytes32(0x2f9ee6cfdf244060dc28aa46347c5219e303fc95062dd672b4e406ca5c29764b)]; - bytes public parachainHeaderProof = bytes("validProof"); - - MockOGateway public gatewayLogic; - GatewayProxy public gateway; - - WETH9 public token; - - address public account1; - address public account2; - address public middleware = makeAddr("middleware"); - - uint64 public maxDispatchGas = 500_000; - uint256 public maxRefund = 1 ether; - uint256 public reward = 1 ether; - bytes32 public messageID = keccak256("cabbage"); - - // remote fees in DOT - uint128 public outboundFee = 1e10; - uint128 public registerTokenFee = 0; - uint128 public sendTokenFee = 1e10; - uint128 public createTokenFee = 1e10; - uint128 public maxDestinationFee = 1e11; - - MultiAddress public recipientAddress32; - MultiAddress public recipientAddress20; - - // For DOT - uint8 public foreignTokenDecimals = 10; - - // ETH/DOT exchange rate - UD60x18 public exchangeRate = ud60x18(0.0025e18); - UD60x18 public multiplier = ud60x18(1e18); - - // tokenID for DOT - bytes32 public dotTokenID; - - uint256 public constant SLASH_FRACTION = 500_000; - uint256 public constant ONE_DAY = 86400; - - ChannelID internal constant PRIMARY_GOVERNANCE_CHANNEL_ID = ChannelID.wrap(bytes32(uint256(1))); - ChannelID internal constant SECONDARY_GOVERNANCE_CHANNEL_ID = ChannelID.wrap(bytes32(uint256(2))); - - // It's generated using VALIDATORS_DATA using scaleCodec. See OSubstrateTypes.EncodedOperatorsData in OSubstrateTypes.sol - bytes private constant FINAL_VALIDATORS_PAYLOAD = - hex"7015003800000cd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe228eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480100000000000000"; - - bytes32[] private VALIDATORS_DATA = [ - bytes32(0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d), - bytes32(0x90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22), - bytes32(0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48) - ]; - - // Test vector generated by: https://github.com/moondance-labs/tanssi/blob/242196324a37ac0020a7c7955bffe09670f63751/primitives/bridge/src/tests.rs#L84 - bytes private constant TEST_VECTOR_SLASH_DATA = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002A000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000030404040404040404040404040404040404040404040404040404040404040404000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000001F405050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000000000000000000000000000000FA0000000000000000000000000000000000000000000000000000000000000019006060606060606060606060606060606060606060606060606060606060606060000000000000000000000000000000000000000000000000000000000000BB8000000000000000000000000000000000000000000000000000000000000012C"; - - bytes private constant TEST_VECTOR_REWARDS_DATA = - hex"00000000000000000000000000000000000000000000000000000000075BCD15000000000000000000000000000000000000000000000000000000000000002A00000000000000000000000000000000000000000000000000007048860DDF79000000000000000000000000000000000000000000000000000000E5F4C8F3CAb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e40101010101010101010101010101010101010101010101010101010101010101"; - - function setUp() public { - AgentExecutor executor = new AgentExecutor(); - gatewayLogic = new MockOGateway( - address(0), address(executor), bridgeHubParaID, bridgeHubAgentID, foreignTokenDecimals, maxDestinationFee - ); - Gateway.Config memory config = Gateway.Config({ - mode: OperatingMode.Normal, - deliveryCost: outboundFee, - registerTokenFee: registerTokenFee, - assetHubParaID: assetHubParaID, - assetHubAgentID: assetHubAgentID, - assetHubCreateAssetFee: createTokenFee, - assetHubReserveTransferFee: sendTokenFee, - exchangeRate: exchangeRate, - multiplier: multiplier, - rescueOperator: 0x4B8a782D4F03ffcB7CE1e95C5cfe5BFCb2C8e967 - }); - gateway = new GatewayProxy(address(gatewayLogic), abi.encode(config)); - MockGateway(address(gateway)).setCommitmentsAreVerified(true); - - SetOperatingModeParams memory params = SetOperatingModeParams({mode: OperatingMode.Normal}); - MockGateway(address(gateway)).setOperatingModePublic(abi.encode(params)); - - bridgeHubAgent = IGateway(address(gateway)).agentOf(bridgeHubAgentID); - assetHubAgent = IGateway(address(gateway)).agentOf(assetHubAgentID); - - // fund the message relayer account - relayer = makeAddr("relayer"); - - // Features - - token = new WETH9(); - - account1 = makeAddr("account1"); - account2 = makeAddr("account2"); - - // create tokens for account 1 - hoax(account1); - token.deposit{value: 500}(); - - // create tokens for account 2 - token.deposit{value: 500}(); - - recipientAddress32 = multiAddressFromBytes32(keccak256("recipient")); - recipientAddress20 = multiAddressFromBytes20(bytes20(keccak256("recipient"))); - - dotTokenID = bytes32(uint256(1)); - } - - function _makeReportSlashesCommand(uint256 slashFraction) public pure returns (Command, bytes memory) { - IOGateway.Slash[] memory slashes = new IOGateway.Slash[](1); - slashes[0] = IOGateway.Slash({operatorKey: bytes32(uint256(1)), slashFraction: slashFraction, epoch: 1}); - uint256 eraIndex = 1; - return (Command.ReportSlashes, abi.encode(IOGateway.SlashParams({eraIndex: eraIndex, slashes: slashes}))); - } - - function _makeReportRewardsCommand() public returns (Command, bytes memory, address) { - uint256 epoch = 0; - uint256 eraIndex = 1; - uint256 totalPointsToken = 1 ether; - uint256 tokensInflatedToken = 1 ether; - bytes32 rewardsRoot = bytes32(uint256(1)); - bytes32 foreignTokenId = bytes32(uint256(1)); - - RegisterForeignTokenParams memory params = - RegisterForeignTokenParams({foreignTokenID: foreignTokenId, name: "Test", symbol: "TST", decimals: 10}); - - vm.expectEmit(true, true, false, false); - emit IGateway.ForeignTokenRegistered(foreignTokenId, address(0)); - MockGateway(address(gateway)).registerForeignTokenPublic(abi.encode(params)); - - address tokenAddress = MockGateway(address(gateway)).tokenAddressOf(foreignTokenId); - - return ( - Command.ReportRewards, - abi.encode(epoch, eraIndex, totalPointsToken, tokensInflatedToken, rewardsRoot, foreignTokenId), - tokenAddress - ); - } - - function makeMockProof() public pure returns (Verification.Proof memory) { - return Verification.Proof({ - leafPartial: Verification.MMRLeafPartial({ - version: 0, - parentNumber: 0, - parentHash: bytes32(0), - nextAuthoritySetID: 0, - nextAuthoritySetLen: 0, - nextAuthoritySetRoot: 0 - }), - leafProof: new bytes32[](0), - leafProofOrder: 0, - parachainHeadsRoot: bytes32(0) - }); - } - - function createLongOperatorsData() public view returns (bytes32[] memory) { - bytes32[] memory result = new bytes32[](1001); - - for (uint256 i = 0; i <= 1000; i++) { - result[i] = VALIDATORS_DATA[i % 3]; - } - - return result; - } - - function _createParaIDAndAgent() public returns (ParaID) { - ParaID paraID = ParaID.wrap(1); - bytes32 agentID = keccak256("1"); - - MockGateway(address(gateway)).createAgentPublic(abi.encode(CreateAgentParams({agentID: agentID}))); - - CreateChannelParams memory params = - CreateChannelParams({channelID: paraID.into(), agentID: agentID, mode: OperatingMode.Normal}); - - MockGateway(address(gateway)).createChannelPublic(abi.encode(params)); - return paraID; - } - - function testSendOperatorsData() public { - // FINAL_VALIDATORS_PAYLOAD has been encoded with epoch 1. - uint48 epoch = 1; - IOGateway(address(gateway)).setMiddleware(middleware); - // Create mock agent and paraID - vm.prank(middleware); - vm.expectEmit(true, false, false, true); - emit IGateway.OutboundMessageAccepted(PRIMARY_GOVERNANCE_CHANNEL_ID, 1, messageID, FINAL_VALIDATORS_PAYLOAD); - - IOGateway(address(gateway)).sendOperatorsData(VALIDATORS_DATA, epoch); - } - - function testShouldNotSendOperatorsDataBecauseOperatorsTooLong() public { - bytes32[] memory longOperatorsData = createLongOperatorsData(); - uint48 epoch = 42; - IOGateway(address(gateway)).setMiddleware(middleware); - vm.prank(middleware); - vm.expectRevert(Operators.Operators__OperatorsLengthTooLong.selector); - IOGateway(address(gateway)).sendOperatorsData(longOperatorsData, epoch); - } - - function testSendOperatorsDataWith50Entries() public { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/snowbridge-data/test_vector_message_validator_50.json"); - string memory json = vm.readFile(path); - - // Get payload - bytes memory final_payload = vm.parseJsonBytes(json, "$.payload"); - - // Get accounts array - bytes32[] memory accounts = abi.decode(vm.parseJson(json, "$.accounts"), (bytes32[])); - - uint48 epoch = abi.decode(vm.parseJson(json, "$.epoch"), (uint48)); - - IOGateway(address(gateway)).setMiddleware(middleware); - - vm.prank(middleware); - vm.expectEmit(true, false, false, true); - emit IGateway.OutboundMessageAccepted(PRIMARY_GOVERNANCE_CHANNEL_ID, 1, messageID, final_payload); - - IOGateway(address(gateway)).sendOperatorsData(accounts, epoch); - } - - function testSendOperatorsDataWith400Entries() public { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/snowbridge-data/test_vector_message_validator_400.json"); - string memory json = vm.readFile(path); - - // Get payload - bytes memory final_payload = vm.parseJsonBytes(json, "$.payload"); - - // Get accounts array - bytes32[] memory accounts = abi.decode(vm.parseJson(json, "$.accounts"), (bytes32[])); - uint48 epoch = abi.decode(vm.parseJson(json, "$.epoch"), (uint48)); - - IOGateway(address(gateway)).setMiddleware(middleware); - - vm.prank(middleware); - vm.expectEmit(true, false, false, true); - emit IGateway.OutboundMessageAccepted(PRIMARY_GOVERNANCE_CHANNEL_ID, 1, messageID, final_payload); - - IOGateway(address(gateway)).sendOperatorsData(accounts, epoch); - } - - function testSendOperatorsDataWith1000Entries() public { - string memory root = vm.projectRoot(); - string memory path = string.concat(root, "/test/snowbridge-data/test_vector_message_validator_1000.json"); - string memory json = vm.readFile(path); - - // Get payload - bytes memory final_payload = vm.parseJsonBytes(json, "$.payload"); - - // Get accounts array - bytes32[] memory accounts = abi.decode(vm.parseJson(json, "$.accounts"), (bytes32[])); - uint48 epoch = abi.decode(vm.parseJson(json, "$.epoch"), (uint48)); - - IOGateway(address(gateway)).setMiddleware(middleware); - - vm.prank(middleware); - vm.expectEmit(true, false, false, true); - emit IGateway.OutboundMessageAccepted(PRIMARY_GOVERNANCE_CHANNEL_ID, 1, messageID, final_payload); - - IOGateway(address(gateway)).sendOperatorsData(accounts, epoch); - } - - function testOwnerCanChangeMiddleware() public { - vm.expectEmit(true, true, false, false); - emit IOGateway.MiddlewareChanged(address(0), 0x0123456789012345678901234567890123456789); - - IOGateway(address(gateway)).setMiddleware(0x0123456789012345678901234567890123456789); - - require(IOGateway(address(gateway)).s_middleware() == 0x0123456789012345678901234567890123456789); - } - - function testNonOwnerCantChangeMiddleware() public { - address notOwner = makeAddr("notOwner"); - vm.prank(notOwner); - vm.expectRevert(abi.encodeWithSelector(Gateway.Unauthorized.selector)); - IOGateway(address(gateway)).setMiddleware(0x9876543210987654321098765432109876543210); - } - - function testDecodeSlashes() public { - uint256 eraIndex = 42; - IOGateway.Slash[] memory slashes = new IOGateway.Slash[](3); - bytes32 alice = 0x0404040404040404040404040404040404040404040404040404040404040404; - bytes32 bob = 0x0505050505050505050505050505050505050505050505050505050505050505; - bytes32 charlie = 0x0606060606060606060606060606060606060606060606060606060606060606; - - slashes[0] = IOGateway.Slash({operatorKey: alice, slashFraction: 5_000, epoch: 500}); - slashes[1] = IOGateway.Slash({operatorKey: bob, slashFraction: 4_000, epoch: 400}); - slashes[2] = IOGateway.Slash({operatorKey: charlie, slashFraction: 3_000, epoch: 300}); - - assertEq(abi.encode(IOGateway.SlashParams({eraIndex: eraIndex, slashes: slashes})), TEST_VECTOR_SLASH_DATA); - } - - // middleware not set, should not be able to process slash - function testSubmitSlashesWithoutMiddleware() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params) = _makeReportSlashesCommand(SLASH_FRACTION); - - vm.expectEmit(true, true, true, true); - emit IOGateway.UnableToProcessSlashMessageB(abi.encodeWithSelector(Gateway.MiddlewareNotSet.selector)); - // Expect the gateway to emit `InboundMessageDispatched` - vm.expectEmit(true, true, true, true); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, false); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - // middleware set, but not complying with the interface, should not process slash - function testSubmitSlashesWithMiddlewareNotComplyingInterface() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params) = _makeReportSlashesCommand(SLASH_FRACTION); - - IOGateway(address(gateway)).setMiddleware(0x0123456789012345678901234567890123456789); - - bytes memory empty; - // Expect the gateway to emit `InboundMessageDispatched` - // For some reason when you are loading an address not complying an interface, you get an empty message - // It still serves us to know that this is the reason - vm.expectEmit(true, true, true, true); - emit IOGateway.UnableToProcessSlashMessageB(empty); - vm.expectEmit(true, true, true, true); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, false); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - // middleware set, complying interface but slash reverts - function testSubmitSlashesWithMiddlewareComplyingInterfaceAndSlashRevert() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params) = _makeReportSlashesCommand(SLASH_FRACTION); - - bytes memory expectedError = bytes("no process slash"); - - // We mock the call so that it reverts - vm.mockCallRevert( - address(middleware), abi.encodeWithSelector(IMiddlewareBasic.slash.selector), "no process slash" - ); - - IOGateway(address(gateway)).setMiddleware(address(middleware)); - - IOGateway.Slash memory expectedSlash = - IOGateway.Slash({operatorKey: bytes32(uint256(1)), slashFraction: SLASH_FRACTION, epoch: 1}); - - vm.expectEmit(true, true, true, true); - emit IOGateway.UnableToProcessIndividualSlashB( - expectedSlash.operatorKey, expectedSlash.slashFraction, expectedSlash.epoch, expectedError - ); - vm.expectEmit(true, true, true, true); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, true); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - // middleware set, complying interface and slash processed - function testSubmitSlashesWithMiddlewareComplyingInterfaceAndSlashProcessed() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params) = _makeReportSlashesCommand(SLASH_FRACTION); - - // We mock the call so that it does not revert - vm.mockCall(address(middleware), abi.encodeWithSelector(IMiddlewareBasic.slash.selector), abi.encode(10)); - - IOGateway(address(gateway)).setMiddleware(address(middleware)); - - // Since we are asserting all fields, the last one is a true, therefore meaning - // that the dispatch went through correctly - - vm.expectEmit(true, true, true, true); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, true); - - hoax(relayer, 1 ether); - vm.recordLogs(); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - - Vm.Log[] memory entries = vm.getRecordedLogs(); - // We assert none of the slash error events has been emitted - for (uint256 i = 0; i < entries.length; i++) { - assertNotEq(entries[i].topics[0], IOGateway.UnableToProcessIndividualSlashB.selector); - assertNotEq(entries[i].topics[0], IOGateway.UnableToProcessIndividualSlashS.selector); - } - } - - function testDecodeRewards() public { - uint256 epoch = 123_456_789; - uint256 eraIndex = 42; - uint256 totalPointsToken = 123_456_789_012_345; - uint256 tokensInflatedToken = 987_654_321_098; - bytes32 rewardsRoot = 0xb6e16d27ac5ab427a7f68900ac5559ce272dc6c37c82b3e052246c82244c50e4; - bytes32 foreignTokenId = 0x0101010101010101010101010101010101010101010101010101010101010101; - - assertEq( - abi.encode(epoch, eraIndex, totalPointsToken, tokensInflatedToken, rewardsRoot, foreignTokenId), - TEST_VECTOR_REWARDS_DATA - ); - } - - function testSubmitRewards() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params, address tokenAddress) = _makeReportRewardsCommand(); - - // We mock the call so that it does not revert - vm.mockCall( - address(middleware), abi.encodeWithSelector(IMiddlewareBasic.distributeRewards.selector), abi.encode(true) - ); - - IOGateway(address(gateway)).setMiddleware(address(middleware)); - - // Expect the gateway to emit `InboundMessageDispatched` - vm.expectEmit(true, true, true, true); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, true); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - - assert(Token(tokenAddress).balanceOf(address(middleware)) > 0); - } - - function testSubmitRewardsWithoutMiddleware() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params, address tokenAddress) = _makeReportRewardsCommand(); - - vm.expectEmit(true, true, true, true); - emit IOGateway.UnableToProcessRewardsMessageB(abi.encodeWithSelector(Gateway.MiddlewareNotSet.selector)); - // Expect the gateway to emit `InboundMessageDispatched` - vm.expectEmit(true, true, true, true); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, false); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - // middleware set, but not complying with the interface, should not process rewards - function testSubmitRewardsWithMiddlewareNotComplyingInterface() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params, address tokenAddress) = _makeReportRewardsCommand(); - - IOGateway(address(gateway)).setMiddleware(0x0123456789012345678901234567890123456789); - - bytes memory empty; - vm.expectEmit(true, true, true, true); - emit IOGateway.UnableToProcessRewardsMessageB(empty); - vm.expectEmit(true, true, true, true); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, false); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - // middleware set, complying interface but rewards reverts - function testSubmitRewardsWithMiddlewareComplyingInterfaceAndRewardsRevert() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params, address tokenAddress) = _makeReportRewardsCommand(); - - bytes memory expectedError = bytes("can't process rewards"); //This should actually come from IODefaultOperatorRewards - - // We mock the call so that it reverts - vm.mockCallRevert( - address(middleware), - abi.encodeWithSelector(IMiddlewareBasic.distributeRewards.selector), - "can't process rewards" - ); - - IOGateway(address(gateway)).setMiddleware(address(middleware)); - - uint256 expectedEpoch = 0; - uint256 expectedEraIndex = 1; - uint256 expectedTotalPointsToken = 1 ether; - uint256 expectedTotalTokensInflated = 1 ether; - bytes32 expectedRewardsRoot = bytes32(uint256(1)); - bytes32 expectedForeignTokenId = bytes32(uint256(1)); - - address expectedTokenAddress = MockGateway(address(gateway)).tokenAddressOf(expectedForeignTokenId); - bytes memory expectedBytes = abi.encodeWithSelector( - Gateway.EUnableToProcessRewardsB.selector, - expectedEpoch, - expectedEraIndex, - expectedTokenAddress, - expectedTotalPointsToken, - expectedTotalTokensInflated, - expectedRewardsRoot, - expectedError - ); - - vm.expectEmit(true, true, true, true); - emit IOGateway.UnableToProcessRewardsMessageB(expectedBytes); - vm.expectEmit(true, true, true, true); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, false); - - hoax(relayer, 1 ether); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } - - // middleware set, complying interface and rewards processed - function testSubmitRewardsWithMiddlewareComplyingInterfaceAndRewardsProcessed() public { - deal(assetHubAgent, 50 ether); - - (Command command, bytes memory params, address tokenAddress) = _makeReportRewardsCommand(); - - // We mock the call so that it does not revert - vm.mockCall( - address(middleware), abi.encodeWithSelector(IMiddlewareBasic.distributeRewards.selector), abi.encode(true) - ); - - IOGateway(address(gateway)).setMiddleware(address(middleware)); - - vm.expectEmit(true, true, true, true); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, true); - - hoax(relayer, 1 ether); - vm.recordLogs(); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, params, maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - - Vm.Log[] memory entries = vm.getRecordedLogs(); - // We assert none of the rewards error events has been emitted - for (uint256 i = 0; i < entries.length; i++) { - assertNotEq(entries[i].topics[0], IOGateway.UnableToProcessRewardsMessageB.selector); - assertNotEq(entries[i].topics[0], IOGateway.UnableToProcessRewardsMessageS.selector); - } - } - - // middleware set, complying interface and rewards processed - function testCommandUnrecognizedShouldEmitNotImplementedCommand() public { - deal(assetHubAgent, 50 ether); - Command command = Command.Reserved12; - - vm.expectEmit(true, false, false, false); - emit IOGateway.NotImplementedCommand(Command.Reserved12); - - vm.expectEmit(true, true, true, true); - emit IGateway.InboundMessageDispatched(assetHubParaID.into(), 1, messageID, false); - - hoax(relayer, 1 ether); - vm.recordLogs(); - IGateway(address(gateway)).submitV1( - InboundMessage(assetHubParaID.into(), 1, command, hex"", maxDispatchGas, maxRefund, reward, messageID), - proof, - makeMockProof() - ); - } -} diff --git a/overridden_contracts/test/snowbridge-data/test_vector_message_validator_1000.json b/overridden_contracts/test/snowbridge-data/test_vector_message_validator_1000.json deleted file mode 100644 index c16dd68..0000000 --- a/overridden_contracts/test/snowbridge-data/test_vector_message_validator_1000.json +++ /dev/null @@ -1,1006 +0,0 @@ -{ - "payload": "0x701500380000a10f000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000780000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008e000000000000000000000000000000000000000000000000000000000000008f0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000b500000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000c700000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000de00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e200000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000e900000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000f700000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000001020000000000000000000000000000000000000000000000000000000000000103000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001050000000000000000000000000000000000000000000000000000000000000106000000000000000000000000000000000000000000000000000000000000010700000000000000000000000000000000000000000000000000000000000001080000000000000000000000000000000000000000000000000000000000000109000000000000000000000000000000000000000000000000000000000000010a000000000000000000000000000000000000000000000000000000000000010b000000000000000000000000000000000000000000000000000000000000010c000000000000000000000000000000000000000000000000000000000000010d000000000000000000000000000000000000000000000000000000000000010e000000000000000000000000000000000000000000000000000000000000010f0000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000011100000000000000000000000000000000000000000000000000000000000001120000000000000000000000000000000000000000000000000000000000000113000000000000000000000000000000000000000000000000000000000000011400000000000000000000000000000000000000000000000000000000000001150000000000000000000000000000000000000000000000000000000000000116000000000000000000000000000000000000000000000000000000000000011700000000000000000000000000000000000000000000000000000000000001180000000000000000000000000000000000000000000000000000000000000119000000000000000000000000000000000000000000000000000000000000011a000000000000000000000000000000000000000000000000000000000000011b000000000000000000000000000000000000000000000000000000000000011c000000000000000000000000000000000000000000000000000000000000011d000000000000000000000000000000000000000000000000000000000000011e000000000000000000000000000000000000000000000000000000000000011f0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000012100000000000000000000000000000000000000000000000000000000000001220000000000000000000000000000000000000000000000000000000000000123000000000000000000000000000000000000000000000000000000000000012400000000000000000000000000000000000000000000000000000000000001250000000000000000000000000000000000000000000000000000000000000126000000000000000000000000000000000000000000000000000000000000012700000000000000000000000000000000000000000000000000000000000001280000000000000000000000000000000000000000000000000000000000000129000000000000000000000000000000000000000000000000000000000000012a000000000000000000000000000000000000000000000000000000000000012b000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000012d000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000012f0000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000001320000000000000000000000000000000000000000000000000000000000000133000000000000000000000000000000000000000000000000000000000000013400000000000000000000000000000000000000000000000000000000000001350000000000000000000000000000000000000000000000000000000000000136000000000000000000000000000000000000000000000000000000000000013700000000000000000000000000000000000000000000000000000000000001380000000000000000000000000000000000000000000000000000000000000139000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000013b000000000000000000000000000000000000000000000000000000000000013c000000000000000000000000000000000000000000000000000000000000013d000000000000000000000000000000000000000000000000000000000000013e000000000000000000000000000000000000000000000000000000000000013f0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000001520000000000000000000000000000000000000000000000000000000000000153000000000000000000000000000000000000000000000000000000000000015400000000000000000000000000000000000000000000000000000000000001550000000000000000000000000000000000000000000000000000000000000156000000000000000000000000000000000000000000000000000000000000015700000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000159000000000000000000000000000000000000000000000000000000000000015a000000000000000000000000000000000000000000000000000000000000015b000000000000000000000000000000000000000000000000000000000000015c000000000000000000000000000000000000000000000000000000000000015d000000000000000000000000000000000000000000000000000000000000015e000000000000000000000000000000000000000000000000000000000000015f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000017100000000000000000000000000000000000000000000000000000000000001720000000000000000000000000000000000000000000000000000000000000173000000000000000000000000000000000000000000000000000000000000017400000000000000000000000000000000000000000000000000000000000001750000000000000000000000000000000000000000000000000000000000000176000000000000000000000000000000000000000000000000000000000000017700000000000000000000000000000000000000000000000000000000000001780000000000000000000000000000000000000000000000000000000000000179000000000000000000000000000000000000000000000000000000000000017a000000000000000000000000000000000000000000000000000000000000017b000000000000000000000000000000000000000000000000000000000000017c000000000000000000000000000000000000000000000000000000000000017d000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000017f0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000019100000000000000000000000000000000000000000000000000000000000001920000000000000000000000000000000000000000000000000000000000000193000000000000000000000000000000000000000000000000000000000000019400000000000000000000000000000000000000000000000000000000000001950000000000000000000000000000000000000000000000000000000000000196000000000000000000000000000000000000000000000000000000000000019700000000000000000000000000000000000000000000000000000000000001980000000000000000000000000000000000000000000000000000000000000199000000000000000000000000000000000000000000000000000000000000019a000000000000000000000000000000000000000000000000000000000000019b000000000000000000000000000000000000000000000000000000000000019c000000000000000000000000000000000000000000000000000000000000019d000000000000000000000000000000000000000000000000000000000000019e000000000000000000000000000000000000000000000000000000000000019f00000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001a100000000000000000000000000000000000000000000000000000000000001a200000000000000000000000000000000000000000000000000000000000001a300000000000000000000000000000000000000000000000000000000000001a400000000000000000000000000000000000000000000000000000000000001a500000000000000000000000000000000000000000000000000000000000001a600000000000000000000000000000000000000000000000000000000000001a700000000000000000000000000000000000000000000000000000000000001a800000000000000000000000000000000000000000000000000000000000001a900000000000000000000000000000000000000000000000000000000000001aa00000000000000000000000000000000000000000000000000000000000001ab00000000000000000000000000000000000000000000000000000000000001ac00000000000000000000000000000000000000000000000000000000000001ad00000000000000000000000000000000000000000000000000000000000001ae00000000000000000000000000000000000000000000000000000000000001af00000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001b100000000000000000000000000000000000000000000000000000000000001b200000000000000000000000000000000000000000000000000000000000001b300000000000000000000000000000000000000000000000000000000000001b400000000000000000000000000000000000000000000000000000000000001b500000000000000000000000000000000000000000000000000000000000001b600000000000000000000000000000000000000000000000000000000000001b700000000000000000000000000000000000000000000000000000000000001b800000000000000000000000000000000000000000000000000000000000001b900000000000000000000000000000000000000000000000000000000000001ba00000000000000000000000000000000000000000000000000000000000001bb00000000000000000000000000000000000000000000000000000000000001bc00000000000000000000000000000000000000000000000000000000000001bd00000000000000000000000000000000000000000000000000000000000001be00000000000000000000000000000000000000000000000000000000000001bf00000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001c100000000000000000000000000000000000000000000000000000000000001c200000000000000000000000000000000000000000000000000000000000001c300000000000000000000000000000000000000000000000000000000000001c400000000000000000000000000000000000000000000000000000000000001c500000000000000000000000000000000000000000000000000000000000001c600000000000000000000000000000000000000000000000000000000000001c700000000000000000000000000000000000000000000000000000000000001c800000000000000000000000000000000000000000000000000000000000001c900000000000000000000000000000000000000000000000000000000000001ca00000000000000000000000000000000000000000000000000000000000001cb00000000000000000000000000000000000000000000000000000000000001cc00000000000000000000000000000000000000000000000000000000000001cd00000000000000000000000000000000000000000000000000000000000001ce00000000000000000000000000000000000000000000000000000000000001cf00000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001d100000000000000000000000000000000000000000000000000000000000001d200000000000000000000000000000000000000000000000000000000000001d300000000000000000000000000000000000000000000000000000000000001d400000000000000000000000000000000000000000000000000000000000001d500000000000000000000000000000000000000000000000000000000000001d600000000000000000000000000000000000000000000000000000000000001d700000000000000000000000000000000000000000000000000000000000001d800000000000000000000000000000000000000000000000000000000000001d900000000000000000000000000000000000000000000000000000000000001da00000000000000000000000000000000000000000000000000000000000001db00000000000000000000000000000000000000000000000000000000000001dc00000000000000000000000000000000000000000000000000000000000001dd00000000000000000000000000000000000000000000000000000000000001de00000000000000000000000000000000000000000000000000000000000001df00000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001e100000000000000000000000000000000000000000000000000000000000001e200000000000000000000000000000000000000000000000000000000000001e300000000000000000000000000000000000000000000000000000000000001e400000000000000000000000000000000000000000000000000000000000001e500000000000000000000000000000000000000000000000000000000000001e600000000000000000000000000000000000000000000000000000000000001e700000000000000000000000000000000000000000000000000000000000001e800000000000000000000000000000000000000000000000000000000000001e900000000000000000000000000000000000000000000000000000000000001ea00000000000000000000000000000000000000000000000000000000000001eb00000000000000000000000000000000000000000000000000000000000001ec00000000000000000000000000000000000000000000000000000000000001ed00000000000000000000000000000000000000000000000000000000000001ee00000000000000000000000000000000000000000000000000000000000001ef00000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000001f100000000000000000000000000000000000000000000000000000000000001f200000000000000000000000000000000000000000000000000000000000001f300000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000001f500000000000000000000000000000000000000000000000000000000000001f600000000000000000000000000000000000000000000000000000000000001f700000000000000000000000000000000000000000000000000000000000001f800000000000000000000000000000000000000000000000000000000000001f900000000000000000000000000000000000000000000000000000000000001fa00000000000000000000000000000000000000000000000000000000000001fb00000000000000000000000000000000000000000000000000000000000001fc00000000000000000000000000000000000000000000000000000000000001fd00000000000000000000000000000000000000000000000000000000000001fe00000000000000000000000000000000000000000000000000000000000001ff0000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020100000000000000000000000000000000000000000000000000000000000002020000000000000000000000000000000000000000000000000000000000000203000000000000000000000000000000000000000000000000000000000000020400000000000000000000000000000000000000000000000000000000000002050000000000000000000000000000000000000000000000000000000000000206000000000000000000000000000000000000000000000000000000000000020700000000000000000000000000000000000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000209000000000000000000000000000000000000000000000000000000000000020a000000000000000000000000000000000000000000000000000000000000020b000000000000000000000000000000000000000000000000000000000000020c000000000000000000000000000000000000000000000000000000000000020d000000000000000000000000000000000000000000000000000000000000020e000000000000000000000000000000000000000000000000000000000000020f0000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000021100000000000000000000000000000000000000000000000000000000000002120000000000000000000000000000000000000000000000000000000000000213000000000000000000000000000000000000000000000000000000000000021400000000000000000000000000000000000000000000000000000000000002150000000000000000000000000000000000000000000000000000000000000216000000000000000000000000000000000000000000000000000000000000021700000000000000000000000000000000000000000000000000000000000002180000000000000000000000000000000000000000000000000000000000000219000000000000000000000000000000000000000000000000000000000000021a000000000000000000000000000000000000000000000000000000000000021b000000000000000000000000000000000000000000000000000000000000021c000000000000000000000000000000000000000000000000000000000000021d000000000000000000000000000000000000000000000000000000000000021e000000000000000000000000000000000000000000000000000000000000021f0000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000022100000000000000000000000000000000000000000000000000000000000002220000000000000000000000000000000000000000000000000000000000000223000000000000000000000000000000000000000000000000000000000000022400000000000000000000000000000000000000000000000000000000000002250000000000000000000000000000000000000000000000000000000000000226000000000000000000000000000000000000000000000000000000000000022700000000000000000000000000000000000000000000000000000000000002280000000000000000000000000000000000000000000000000000000000000229000000000000000000000000000000000000000000000000000000000000022a000000000000000000000000000000000000000000000000000000000000022b000000000000000000000000000000000000000000000000000000000000022c000000000000000000000000000000000000000000000000000000000000022d000000000000000000000000000000000000000000000000000000000000022e000000000000000000000000000000000000000000000000000000000000022f0000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000023100000000000000000000000000000000000000000000000000000000000002320000000000000000000000000000000000000000000000000000000000000233000000000000000000000000000000000000000000000000000000000000023400000000000000000000000000000000000000000000000000000000000002350000000000000000000000000000000000000000000000000000000000000236000000000000000000000000000000000000000000000000000000000000023700000000000000000000000000000000000000000000000000000000000002380000000000000000000000000000000000000000000000000000000000000239000000000000000000000000000000000000000000000000000000000000023a000000000000000000000000000000000000000000000000000000000000023b000000000000000000000000000000000000000000000000000000000000023c000000000000000000000000000000000000000000000000000000000000023d000000000000000000000000000000000000000000000000000000000000023e000000000000000000000000000000000000000000000000000000000000023f0000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000024100000000000000000000000000000000000000000000000000000000000002420000000000000000000000000000000000000000000000000000000000000243000000000000000000000000000000000000000000000000000000000000024400000000000000000000000000000000000000000000000000000000000002450000000000000000000000000000000000000000000000000000000000000246000000000000000000000000000000000000000000000000000000000000024700000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000249000000000000000000000000000000000000000000000000000000000000024a000000000000000000000000000000000000000000000000000000000000024b000000000000000000000000000000000000000000000000000000000000024c000000000000000000000000000000000000000000000000000000000000024d000000000000000000000000000000000000000000000000000000000000024e000000000000000000000000000000000000000000000000000000000000024f0000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000025100000000000000000000000000000000000000000000000000000000000002520000000000000000000000000000000000000000000000000000000000000253000000000000000000000000000000000000000000000000000000000000025400000000000000000000000000000000000000000000000000000000000002550000000000000000000000000000000000000000000000000000000000000256000000000000000000000000000000000000000000000000000000000000025700000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000259000000000000000000000000000000000000000000000000000000000000025a000000000000000000000000000000000000000000000000000000000000025b000000000000000000000000000000000000000000000000000000000000025c000000000000000000000000000000000000000000000000000000000000025d000000000000000000000000000000000000000000000000000000000000025e000000000000000000000000000000000000000000000000000000000000025f0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000026100000000000000000000000000000000000000000000000000000000000002620000000000000000000000000000000000000000000000000000000000000263000000000000000000000000000000000000000000000000000000000000026400000000000000000000000000000000000000000000000000000000000002650000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000026700000000000000000000000000000000000000000000000000000000000002680000000000000000000000000000000000000000000000000000000000000269000000000000000000000000000000000000000000000000000000000000026a000000000000000000000000000000000000000000000000000000000000026b000000000000000000000000000000000000000000000000000000000000026c000000000000000000000000000000000000000000000000000000000000026d000000000000000000000000000000000000000000000000000000000000026e000000000000000000000000000000000000000000000000000000000000026f0000000000000000000000000000000000000000000000000000000000000270000000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000002720000000000000000000000000000000000000000000000000000000000000273000000000000000000000000000000000000000000000000000000000000027400000000000000000000000000000000000000000000000000000000000002750000000000000000000000000000000000000000000000000000000000000276000000000000000000000000000000000000000000000000000000000000027700000000000000000000000000000000000000000000000000000000000002780000000000000000000000000000000000000000000000000000000000000279000000000000000000000000000000000000000000000000000000000000027a000000000000000000000000000000000000000000000000000000000000027b000000000000000000000000000000000000000000000000000000000000027c000000000000000000000000000000000000000000000000000000000000027d000000000000000000000000000000000000000000000000000000000000027e000000000000000000000000000000000000000000000000000000000000027f0000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000028100000000000000000000000000000000000000000000000000000000000002820000000000000000000000000000000000000000000000000000000000000283000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002850000000000000000000000000000000000000000000000000000000000000286000000000000000000000000000000000000000000000000000000000000028700000000000000000000000000000000000000000000000000000000000002880000000000000000000000000000000000000000000000000000000000000289000000000000000000000000000000000000000000000000000000000000028a000000000000000000000000000000000000000000000000000000000000028b000000000000000000000000000000000000000000000000000000000000028c000000000000000000000000000000000000000000000000000000000000028d000000000000000000000000000000000000000000000000000000000000028e000000000000000000000000000000000000000000000000000000000000028f0000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000029100000000000000000000000000000000000000000000000000000000000002920000000000000000000000000000000000000000000000000000000000000293000000000000000000000000000000000000000000000000000000000000029400000000000000000000000000000000000000000000000000000000000002950000000000000000000000000000000000000000000000000000000000000296000000000000000000000000000000000000000000000000000000000000029700000000000000000000000000000000000000000000000000000000000002980000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029a000000000000000000000000000000000000000000000000000000000000029b000000000000000000000000000000000000000000000000000000000000029c000000000000000000000000000000000000000000000000000000000000029d000000000000000000000000000000000000000000000000000000000000029e000000000000000000000000000000000000000000000000000000000000029f00000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a100000000000000000000000000000000000000000000000000000000000002a200000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000002a400000000000000000000000000000000000000000000000000000000000002a500000000000000000000000000000000000000000000000000000000000002a600000000000000000000000000000000000000000000000000000000000002a700000000000000000000000000000000000000000000000000000000000002a800000000000000000000000000000000000000000000000000000000000002a900000000000000000000000000000000000000000000000000000000000002aa00000000000000000000000000000000000000000000000000000000000002ab00000000000000000000000000000000000000000000000000000000000002ac00000000000000000000000000000000000000000000000000000000000002ad00000000000000000000000000000000000000000000000000000000000002ae00000000000000000000000000000000000000000000000000000000000002af00000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002b100000000000000000000000000000000000000000000000000000000000002b200000000000000000000000000000000000000000000000000000000000002b300000000000000000000000000000000000000000000000000000000000002b400000000000000000000000000000000000000000000000000000000000002b500000000000000000000000000000000000000000000000000000000000002b600000000000000000000000000000000000000000000000000000000000002b700000000000000000000000000000000000000000000000000000000000002b800000000000000000000000000000000000000000000000000000000000002b900000000000000000000000000000000000000000000000000000000000002ba00000000000000000000000000000000000000000000000000000000000002bb00000000000000000000000000000000000000000000000000000000000002bc00000000000000000000000000000000000000000000000000000000000002bd00000000000000000000000000000000000000000000000000000000000002be00000000000000000000000000000000000000000000000000000000000002bf00000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002c100000000000000000000000000000000000000000000000000000000000002c200000000000000000000000000000000000000000000000000000000000002c300000000000000000000000000000000000000000000000000000000000002c400000000000000000000000000000000000000000000000000000000000002c500000000000000000000000000000000000000000000000000000000000002c600000000000000000000000000000000000000000000000000000000000002c700000000000000000000000000000000000000000000000000000000000002c800000000000000000000000000000000000000000000000000000000000002c900000000000000000000000000000000000000000000000000000000000002ca00000000000000000000000000000000000000000000000000000000000002cb00000000000000000000000000000000000000000000000000000000000002cc00000000000000000000000000000000000000000000000000000000000002cd00000000000000000000000000000000000000000000000000000000000002ce00000000000000000000000000000000000000000000000000000000000002cf00000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002d100000000000000000000000000000000000000000000000000000000000002d200000000000000000000000000000000000000000000000000000000000002d300000000000000000000000000000000000000000000000000000000000002d400000000000000000000000000000000000000000000000000000000000002d500000000000000000000000000000000000000000000000000000000000002d600000000000000000000000000000000000000000000000000000000000002d700000000000000000000000000000000000000000000000000000000000002d800000000000000000000000000000000000000000000000000000000000002d900000000000000000000000000000000000000000000000000000000000002da00000000000000000000000000000000000000000000000000000000000002db00000000000000000000000000000000000000000000000000000000000002dc00000000000000000000000000000000000000000000000000000000000002dd00000000000000000000000000000000000000000000000000000000000002de00000000000000000000000000000000000000000000000000000000000002df00000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002e100000000000000000000000000000000000000000000000000000000000002e200000000000000000000000000000000000000000000000000000000000002e300000000000000000000000000000000000000000000000000000000000002e400000000000000000000000000000000000000000000000000000000000002e500000000000000000000000000000000000000000000000000000000000002e600000000000000000000000000000000000000000000000000000000000002e700000000000000000000000000000000000000000000000000000000000002e800000000000000000000000000000000000000000000000000000000000002e900000000000000000000000000000000000000000000000000000000000002ea00000000000000000000000000000000000000000000000000000000000002eb00000000000000000000000000000000000000000000000000000000000002ec00000000000000000000000000000000000000000000000000000000000002ed00000000000000000000000000000000000000000000000000000000000002ee00000000000000000000000000000000000000000000000000000000000002ef00000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f100000000000000000000000000000000000000000000000000000000000002f200000000000000000000000000000000000000000000000000000000000002f300000000000000000000000000000000000000000000000000000000000002f400000000000000000000000000000000000000000000000000000000000002f500000000000000000000000000000000000000000000000000000000000002f600000000000000000000000000000000000000000000000000000000000002f700000000000000000000000000000000000000000000000000000000000002f800000000000000000000000000000000000000000000000000000000000002f900000000000000000000000000000000000000000000000000000000000002fa00000000000000000000000000000000000000000000000000000000000002fb00000000000000000000000000000000000000000000000000000000000002fc00000000000000000000000000000000000000000000000000000000000002fd00000000000000000000000000000000000000000000000000000000000002fe00000000000000000000000000000000000000000000000000000000000002ff0000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000030100000000000000000000000000000000000000000000000000000000000003020000000000000000000000000000000000000000000000000000000000000303000000000000000000000000000000000000000000000000000000000000030400000000000000000000000000000000000000000000000000000000000003050000000000000000000000000000000000000000000000000000000000000306000000000000000000000000000000000000000000000000000000000000030700000000000000000000000000000000000000000000000000000000000003080000000000000000000000000000000000000000000000000000000000000309000000000000000000000000000000000000000000000000000000000000030a000000000000000000000000000000000000000000000000000000000000030b000000000000000000000000000000000000000000000000000000000000030c000000000000000000000000000000000000000000000000000000000000030d000000000000000000000000000000000000000000000000000000000000030e000000000000000000000000000000000000000000000000000000000000030f0000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000031100000000000000000000000000000000000000000000000000000000000003120000000000000000000000000000000000000000000000000000000000000313000000000000000000000000000000000000000000000000000000000000031400000000000000000000000000000000000000000000000000000000000003150000000000000000000000000000000000000000000000000000000000000316000000000000000000000000000000000000000000000000000000000000031700000000000000000000000000000000000000000000000000000000000003180000000000000000000000000000000000000000000000000000000000000319000000000000000000000000000000000000000000000000000000000000031a000000000000000000000000000000000000000000000000000000000000031b000000000000000000000000000000000000000000000000000000000000031c000000000000000000000000000000000000000000000000000000000000031d000000000000000000000000000000000000000000000000000000000000031e000000000000000000000000000000000000000000000000000000000000031f0000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000032100000000000000000000000000000000000000000000000000000000000003220000000000000000000000000000000000000000000000000000000000000323000000000000000000000000000000000000000000000000000000000000032400000000000000000000000000000000000000000000000000000000000003250000000000000000000000000000000000000000000000000000000000000326000000000000000000000000000000000000000000000000000000000000032700000000000000000000000000000000000000000000000000000000000003280000000000000000000000000000000000000000000000000000000000000329000000000000000000000000000000000000000000000000000000000000032a000000000000000000000000000000000000000000000000000000000000032b000000000000000000000000000000000000000000000000000000000000032c000000000000000000000000000000000000000000000000000000000000032d000000000000000000000000000000000000000000000000000000000000032e000000000000000000000000000000000000000000000000000000000000032f0000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000033100000000000000000000000000000000000000000000000000000000000003320000000000000000000000000000000000000000000000000000000000000333000000000000000000000000000000000000000000000000000000000000033400000000000000000000000000000000000000000000000000000000000003350000000000000000000000000000000000000000000000000000000000000336000000000000000000000000000000000000000000000000000000000000033700000000000000000000000000000000000000000000000000000000000003380000000000000000000000000000000000000000000000000000000000000339000000000000000000000000000000000000000000000000000000000000033a000000000000000000000000000000000000000000000000000000000000033b000000000000000000000000000000000000000000000000000000000000033c000000000000000000000000000000000000000000000000000000000000033d000000000000000000000000000000000000000000000000000000000000033e000000000000000000000000000000000000000000000000000000000000033f0000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034100000000000000000000000000000000000000000000000000000000000003420000000000000000000000000000000000000000000000000000000000000343000000000000000000000000000000000000000000000000000000000000034400000000000000000000000000000000000000000000000000000000000003450000000000000000000000000000000000000000000000000000000000000346000000000000000000000000000000000000000000000000000000000000034700000000000000000000000000000000000000000000000000000000000003480000000000000000000000000000000000000000000000000000000000000349000000000000000000000000000000000000000000000000000000000000034a000000000000000000000000000000000000000000000000000000000000034b000000000000000000000000000000000000000000000000000000000000034c000000000000000000000000000000000000000000000000000000000000034d000000000000000000000000000000000000000000000000000000000000034e000000000000000000000000000000000000000000000000000000000000034f0000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000035100000000000000000000000000000000000000000000000000000000000003520000000000000000000000000000000000000000000000000000000000000353000000000000000000000000000000000000000000000000000000000000035400000000000000000000000000000000000000000000000000000000000003550000000000000000000000000000000000000000000000000000000000000356000000000000000000000000000000000000000000000000000000000000035700000000000000000000000000000000000000000000000000000000000003580000000000000000000000000000000000000000000000000000000000000359000000000000000000000000000000000000000000000000000000000000035a000000000000000000000000000000000000000000000000000000000000035b000000000000000000000000000000000000000000000000000000000000035c000000000000000000000000000000000000000000000000000000000000035d000000000000000000000000000000000000000000000000000000000000035e000000000000000000000000000000000000000000000000000000000000035f0000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000036100000000000000000000000000000000000000000000000000000000000003620000000000000000000000000000000000000000000000000000000000000363000000000000000000000000000000000000000000000000000000000000036400000000000000000000000000000000000000000000000000000000000003650000000000000000000000000000000000000000000000000000000000000366000000000000000000000000000000000000000000000000000000000000036700000000000000000000000000000000000000000000000000000000000003680000000000000000000000000000000000000000000000000000000000000369000000000000000000000000000000000000000000000000000000000000036a000000000000000000000000000000000000000000000000000000000000036b000000000000000000000000000000000000000000000000000000000000036c000000000000000000000000000000000000000000000000000000000000036d000000000000000000000000000000000000000000000000000000000000036e000000000000000000000000000000000000000000000000000000000000036f0000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000037100000000000000000000000000000000000000000000000000000000000003720000000000000000000000000000000000000000000000000000000000000373000000000000000000000000000000000000000000000000000000000000037400000000000000000000000000000000000000000000000000000000000003750000000000000000000000000000000000000000000000000000000000000376000000000000000000000000000000000000000000000000000000000000037700000000000000000000000000000000000000000000000000000000000003780000000000000000000000000000000000000000000000000000000000000379000000000000000000000000000000000000000000000000000000000000037a000000000000000000000000000000000000000000000000000000000000037b000000000000000000000000000000000000000000000000000000000000037c000000000000000000000000000000000000000000000000000000000000037d000000000000000000000000000000000000000000000000000000000000037e000000000000000000000000000000000000000000000000000000000000037f0000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000038100000000000000000000000000000000000000000000000000000000000003820000000000000000000000000000000000000000000000000000000000000383000000000000000000000000000000000000000000000000000000000000038400000000000000000000000000000000000000000000000000000000000003850000000000000000000000000000000000000000000000000000000000000386000000000000000000000000000000000000000000000000000000000000038700000000000000000000000000000000000000000000000000000000000003880000000000000000000000000000000000000000000000000000000000000389000000000000000000000000000000000000000000000000000000000000038a000000000000000000000000000000000000000000000000000000000000038b000000000000000000000000000000000000000000000000000000000000038c000000000000000000000000000000000000000000000000000000000000038d000000000000000000000000000000000000000000000000000000000000038e000000000000000000000000000000000000000000000000000000000000038f0000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000039100000000000000000000000000000000000000000000000000000000000003920000000000000000000000000000000000000000000000000000000000000393000000000000000000000000000000000000000000000000000000000000039400000000000000000000000000000000000000000000000000000000000003950000000000000000000000000000000000000000000000000000000000000396000000000000000000000000000000000000000000000000000000000000039700000000000000000000000000000000000000000000000000000000000003980000000000000000000000000000000000000000000000000000000000000399000000000000000000000000000000000000000000000000000000000000039a000000000000000000000000000000000000000000000000000000000000039b000000000000000000000000000000000000000000000000000000000000039c000000000000000000000000000000000000000000000000000000000000039d000000000000000000000000000000000000000000000000000000000000039e000000000000000000000000000000000000000000000000000000000000039f00000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003a100000000000000000000000000000000000000000000000000000000000003a200000000000000000000000000000000000000000000000000000000000003a300000000000000000000000000000000000000000000000000000000000003a400000000000000000000000000000000000000000000000000000000000003a500000000000000000000000000000000000000000000000000000000000003a600000000000000000000000000000000000000000000000000000000000003a700000000000000000000000000000000000000000000000000000000000003a800000000000000000000000000000000000000000000000000000000000003a900000000000000000000000000000000000000000000000000000000000003aa00000000000000000000000000000000000000000000000000000000000003ab00000000000000000000000000000000000000000000000000000000000003ac00000000000000000000000000000000000000000000000000000000000003ad00000000000000000000000000000000000000000000000000000000000003ae00000000000000000000000000000000000000000000000000000000000003af00000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003b100000000000000000000000000000000000000000000000000000000000003b200000000000000000000000000000000000000000000000000000000000003b300000000000000000000000000000000000000000000000000000000000003b400000000000000000000000000000000000000000000000000000000000003b500000000000000000000000000000000000000000000000000000000000003b600000000000000000000000000000000000000000000000000000000000003b700000000000000000000000000000000000000000000000000000000000003b800000000000000000000000000000000000000000000000000000000000003b900000000000000000000000000000000000000000000000000000000000003ba00000000000000000000000000000000000000000000000000000000000003bb00000000000000000000000000000000000000000000000000000000000003bc00000000000000000000000000000000000000000000000000000000000003bd00000000000000000000000000000000000000000000000000000000000003be00000000000000000000000000000000000000000000000000000000000003bf00000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003c100000000000000000000000000000000000000000000000000000000000003c200000000000000000000000000000000000000000000000000000000000003c300000000000000000000000000000000000000000000000000000000000003c400000000000000000000000000000000000000000000000000000000000003c500000000000000000000000000000000000000000000000000000000000003c600000000000000000000000000000000000000000000000000000000000003c700000000000000000000000000000000000000000000000000000000000003c800000000000000000000000000000000000000000000000000000000000003c900000000000000000000000000000000000000000000000000000000000003ca00000000000000000000000000000000000000000000000000000000000003cb00000000000000000000000000000000000000000000000000000000000003cc00000000000000000000000000000000000000000000000000000000000003cd00000000000000000000000000000000000000000000000000000000000003ce00000000000000000000000000000000000000000000000000000000000003cf00000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003d100000000000000000000000000000000000000000000000000000000000003d200000000000000000000000000000000000000000000000000000000000003d300000000000000000000000000000000000000000000000000000000000003d400000000000000000000000000000000000000000000000000000000000003d500000000000000000000000000000000000000000000000000000000000003d600000000000000000000000000000000000000000000000000000000000003d700000000000000000000000000000000000000000000000000000000000003d800000000000000000000000000000000000000000000000000000000000003d900000000000000000000000000000000000000000000000000000000000003da00000000000000000000000000000000000000000000000000000000000003db00000000000000000000000000000000000000000000000000000000000003dc00000000000000000000000000000000000000000000000000000000000003dd00000000000000000000000000000000000000000000000000000000000003de00000000000000000000000000000000000000000000000000000000000003df00000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003e100000000000000000000000000000000000000000000000000000000000003e200000000000000000000000000000000000000000000000000000000000003e300000000000000000000000000000000000000000000000000000000000003e400000000000000000000000000000000000000000000000000000000000003e500000000000000000000000000000000000000000000000000000000000003e600000000000000000000000000000000000000000000000000000000000003e700000000000000000000000000000000000000000000000000000000000003e8ad27000000000000", - "accounts": [ - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000033", - "0x0000000000000000000000000000000000000000000000000000000000000034", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000036", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000038", - "0x0000000000000000000000000000000000000000000000000000000000000039", - "0x000000000000000000000000000000000000000000000000000000000000003a", - "0x000000000000000000000000000000000000000000000000000000000000003b", - "0x000000000000000000000000000000000000000000000000000000000000003c", - "0x000000000000000000000000000000000000000000000000000000000000003d", - "0x000000000000000000000000000000000000000000000000000000000000003e", - "0x000000000000000000000000000000000000000000000000000000000000003f", - "0x0000000000000000000000000000000000000000000000000000000000000040", - "0x0000000000000000000000000000000000000000000000000000000000000041", - "0x0000000000000000000000000000000000000000000000000000000000000042", - "0x0000000000000000000000000000000000000000000000000000000000000043", - "0x0000000000000000000000000000000000000000000000000000000000000044", - "0x0000000000000000000000000000000000000000000000000000000000000045", - "0x0000000000000000000000000000000000000000000000000000000000000046", - "0x0000000000000000000000000000000000000000000000000000000000000047", - "0x0000000000000000000000000000000000000000000000000000000000000048", - "0x0000000000000000000000000000000000000000000000000000000000000049", - "0x000000000000000000000000000000000000000000000000000000000000004a", - "0x000000000000000000000000000000000000000000000000000000000000004b", - "0x000000000000000000000000000000000000000000000000000000000000004c", - "0x000000000000000000000000000000000000000000000000000000000000004d", - "0x000000000000000000000000000000000000000000000000000000000000004e", - "0x000000000000000000000000000000000000000000000000000000000000004f", - "0x0000000000000000000000000000000000000000000000000000000000000050", - "0x0000000000000000000000000000000000000000000000000000000000000051", - "0x0000000000000000000000000000000000000000000000000000000000000052", - "0x0000000000000000000000000000000000000000000000000000000000000053", - "0x0000000000000000000000000000000000000000000000000000000000000054", - "0x0000000000000000000000000000000000000000000000000000000000000055", - "0x0000000000000000000000000000000000000000000000000000000000000056", - "0x0000000000000000000000000000000000000000000000000000000000000057", - "0x0000000000000000000000000000000000000000000000000000000000000058", - "0x0000000000000000000000000000000000000000000000000000000000000059", - "0x000000000000000000000000000000000000000000000000000000000000005a", - "0x000000000000000000000000000000000000000000000000000000000000005b", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x000000000000000000000000000000000000000000000000000000000000006d", - "0x000000000000000000000000000000000000000000000000000000000000006e", - "0x000000000000000000000000000000000000000000000000000000000000006f", - "0x0000000000000000000000000000000000000000000000000000000000000070", - "0x0000000000000000000000000000000000000000000000000000000000000071", - "0x0000000000000000000000000000000000000000000000000000000000000072", - "0x0000000000000000000000000000000000000000000000000000000000000073", - "0x0000000000000000000000000000000000000000000000000000000000000074", - "0x0000000000000000000000000000000000000000000000000000000000000075", - "0x0000000000000000000000000000000000000000000000000000000000000076", - "0x0000000000000000000000000000000000000000000000000000000000000077", - "0x0000000000000000000000000000000000000000000000000000000000000078", - "0x0000000000000000000000000000000000000000000000000000000000000079", - "0x000000000000000000000000000000000000000000000000000000000000007a", - "0x000000000000000000000000000000000000000000000000000000000000007b", - "0x000000000000000000000000000000000000000000000000000000000000007c", - "0x000000000000000000000000000000000000000000000000000000000000007d", - "0x000000000000000000000000000000000000000000000000000000000000007e", - "0x000000000000000000000000000000000000000000000000000000000000007f", - "0x0000000000000000000000000000000000000000000000000000000000000080", - "0x0000000000000000000000000000000000000000000000000000000000000081", - "0x0000000000000000000000000000000000000000000000000000000000000082", - "0x0000000000000000000000000000000000000000000000000000000000000083", - "0x0000000000000000000000000000000000000000000000000000000000000084", - "0x0000000000000000000000000000000000000000000000000000000000000085", - "0x0000000000000000000000000000000000000000000000000000000000000086", - "0x0000000000000000000000000000000000000000000000000000000000000087", - "0x0000000000000000000000000000000000000000000000000000000000000088", - "0x0000000000000000000000000000000000000000000000000000000000000089", - "0x000000000000000000000000000000000000000000000000000000000000008a", - "0x000000000000000000000000000000000000000000000000000000000000008b", - "0x000000000000000000000000000000000000000000000000000000000000008c", - "0x000000000000000000000000000000000000000000000000000000000000008d", - "0x000000000000000000000000000000000000000000000000000000000000008e", - "0x000000000000000000000000000000000000000000000000000000000000008f", - "0x0000000000000000000000000000000000000000000000000000000000000090", - "0x0000000000000000000000000000000000000000000000000000000000000091", - "0x0000000000000000000000000000000000000000000000000000000000000092", - "0x0000000000000000000000000000000000000000000000000000000000000093", - "0x0000000000000000000000000000000000000000000000000000000000000094", - "0x0000000000000000000000000000000000000000000000000000000000000095", - "0x0000000000000000000000000000000000000000000000000000000000000096", - "0x0000000000000000000000000000000000000000000000000000000000000097", - "0x0000000000000000000000000000000000000000000000000000000000000098", - "0x0000000000000000000000000000000000000000000000000000000000000099", - "0x000000000000000000000000000000000000000000000000000000000000009a", - "0x000000000000000000000000000000000000000000000000000000000000009b", - "0x000000000000000000000000000000000000000000000000000000000000009c", - "0x000000000000000000000000000000000000000000000000000000000000009d", - "0x000000000000000000000000000000000000000000000000000000000000009e", - "0x000000000000000000000000000000000000000000000000000000000000009f", - "0x00000000000000000000000000000000000000000000000000000000000000a0", - "0x00000000000000000000000000000000000000000000000000000000000000a1", - "0x00000000000000000000000000000000000000000000000000000000000000a2", - "0x00000000000000000000000000000000000000000000000000000000000000a3", - "0x00000000000000000000000000000000000000000000000000000000000000a4", - "0x00000000000000000000000000000000000000000000000000000000000000a5", - "0x00000000000000000000000000000000000000000000000000000000000000a6", - "0x00000000000000000000000000000000000000000000000000000000000000a7", - "0x00000000000000000000000000000000000000000000000000000000000000a8", - "0x00000000000000000000000000000000000000000000000000000000000000a9", - "0x00000000000000000000000000000000000000000000000000000000000000aa", - "0x00000000000000000000000000000000000000000000000000000000000000ab", - "0x00000000000000000000000000000000000000000000000000000000000000ac", - "0x00000000000000000000000000000000000000000000000000000000000000ad", - "0x00000000000000000000000000000000000000000000000000000000000000ae", - "0x00000000000000000000000000000000000000000000000000000000000000af", - "0x00000000000000000000000000000000000000000000000000000000000000b0", - "0x00000000000000000000000000000000000000000000000000000000000000b1", - "0x00000000000000000000000000000000000000000000000000000000000000b2", - "0x00000000000000000000000000000000000000000000000000000000000000b3", - "0x00000000000000000000000000000000000000000000000000000000000000b4", - "0x00000000000000000000000000000000000000000000000000000000000000b5", - "0x00000000000000000000000000000000000000000000000000000000000000b6", - "0x00000000000000000000000000000000000000000000000000000000000000b7", - "0x00000000000000000000000000000000000000000000000000000000000000b8", - "0x00000000000000000000000000000000000000000000000000000000000000b9", - "0x00000000000000000000000000000000000000000000000000000000000000ba", - "0x00000000000000000000000000000000000000000000000000000000000000bb", - "0x00000000000000000000000000000000000000000000000000000000000000bc", - "0x00000000000000000000000000000000000000000000000000000000000000bd", - "0x00000000000000000000000000000000000000000000000000000000000000be", - "0x00000000000000000000000000000000000000000000000000000000000000bf", - "0x00000000000000000000000000000000000000000000000000000000000000c0", - "0x00000000000000000000000000000000000000000000000000000000000000c1", - "0x00000000000000000000000000000000000000000000000000000000000000c2", - "0x00000000000000000000000000000000000000000000000000000000000000c3", - "0x00000000000000000000000000000000000000000000000000000000000000c4", - "0x00000000000000000000000000000000000000000000000000000000000000c5", - "0x00000000000000000000000000000000000000000000000000000000000000c6", - "0x00000000000000000000000000000000000000000000000000000000000000c7", - "0x00000000000000000000000000000000000000000000000000000000000000c8", - "0x00000000000000000000000000000000000000000000000000000000000000c9", - "0x00000000000000000000000000000000000000000000000000000000000000ca", - "0x00000000000000000000000000000000000000000000000000000000000000cb", - "0x00000000000000000000000000000000000000000000000000000000000000cc", - "0x00000000000000000000000000000000000000000000000000000000000000cd", - "0x00000000000000000000000000000000000000000000000000000000000000ce", - "0x00000000000000000000000000000000000000000000000000000000000000cf", - "0x00000000000000000000000000000000000000000000000000000000000000d0", - "0x00000000000000000000000000000000000000000000000000000000000000d1", - "0x00000000000000000000000000000000000000000000000000000000000000d2", - "0x00000000000000000000000000000000000000000000000000000000000000d3", - "0x00000000000000000000000000000000000000000000000000000000000000d4", - "0x00000000000000000000000000000000000000000000000000000000000000d5", - "0x00000000000000000000000000000000000000000000000000000000000000d6", - "0x00000000000000000000000000000000000000000000000000000000000000d7", - "0x00000000000000000000000000000000000000000000000000000000000000d8", - "0x00000000000000000000000000000000000000000000000000000000000000d9", - "0x00000000000000000000000000000000000000000000000000000000000000da", - "0x00000000000000000000000000000000000000000000000000000000000000db", - "0x00000000000000000000000000000000000000000000000000000000000000dc", - "0x00000000000000000000000000000000000000000000000000000000000000dd", - "0x00000000000000000000000000000000000000000000000000000000000000de", - "0x00000000000000000000000000000000000000000000000000000000000000df", - "0x00000000000000000000000000000000000000000000000000000000000000e0", - "0x00000000000000000000000000000000000000000000000000000000000000e1", - "0x00000000000000000000000000000000000000000000000000000000000000e2", - "0x00000000000000000000000000000000000000000000000000000000000000e3", - "0x00000000000000000000000000000000000000000000000000000000000000e4", - "0x00000000000000000000000000000000000000000000000000000000000000e5", - "0x00000000000000000000000000000000000000000000000000000000000000e6", - "0x00000000000000000000000000000000000000000000000000000000000000e7", - "0x00000000000000000000000000000000000000000000000000000000000000e8", - "0x00000000000000000000000000000000000000000000000000000000000000e9", - "0x00000000000000000000000000000000000000000000000000000000000000ea", - "0x00000000000000000000000000000000000000000000000000000000000000eb", - "0x00000000000000000000000000000000000000000000000000000000000000ec", - "0x00000000000000000000000000000000000000000000000000000000000000ed", - "0x00000000000000000000000000000000000000000000000000000000000000ee", - "0x00000000000000000000000000000000000000000000000000000000000000ef", - "0x00000000000000000000000000000000000000000000000000000000000000f0", - "0x00000000000000000000000000000000000000000000000000000000000000f1", - "0x00000000000000000000000000000000000000000000000000000000000000f2", - "0x00000000000000000000000000000000000000000000000000000000000000f3", - "0x00000000000000000000000000000000000000000000000000000000000000f4", - "0x00000000000000000000000000000000000000000000000000000000000000f5", - "0x00000000000000000000000000000000000000000000000000000000000000f6", - "0x00000000000000000000000000000000000000000000000000000000000000f7", - "0x00000000000000000000000000000000000000000000000000000000000000f8", - "0x00000000000000000000000000000000000000000000000000000000000000f9", - "0x00000000000000000000000000000000000000000000000000000000000000fa", - "0x00000000000000000000000000000000000000000000000000000000000000fb", - "0x00000000000000000000000000000000000000000000000000000000000000fc", - "0x00000000000000000000000000000000000000000000000000000000000000fd", - "0x00000000000000000000000000000000000000000000000000000000000000fe", - "0x00000000000000000000000000000000000000000000000000000000000000ff", - "0x0000000000000000000000000000000000000000000000000000000000000100", - "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000102", - "0x0000000000000000000000000000000000000000000000000000000000000103", - "0x0000000000000000000000000000000000000000000000000000000000000104", - "0x0000000000000000000000000000000000000000000000000000000000000105", - "0x0000000000000000000000000000000000000000000000000000000000000106", - "0x0000000000000000000000000000000000000000000000000000000000000107", - "0x0000000000000000000000000000000000000000000000000000000000000108", - "0x0000000000000000000000000000000000000000000000000000000000000109", - "0x000000000000000000000000000000000000000000000000000000000000010a", - "0x000000000000000000000000000000000000000000000000000000000000010b", - "0x000000000000000000000000000000000000000000000000000000000000010c", - "0x000000000000000000000000000000000000000000000000000000000000010d", - "0x000000000000000000000000000000000000000000000000000000000000010e", - "0x000000000000000000000000000000000000000000000000000000000000010f", - "0x0000000000000000000000000000000000000000000000000000000000000110", - "0x0000000000000000000000000000000000000000000000000000000000000111", - "0x0000000000000000000000000000000000000000000000000000000000000112", - "0x0000000000000000000000000000000000000000000000000000000000000113", - "0x0000000000000000000000000000000000000000000000000000000000000114", - "0x0000000000000000000000000000000000000000000000000000000000000115", - "0x0000000000000000000000000000000000000000000000000000000000000116", - "0x0000000000000000000000000000000000000000000000000000000000000117", - "0x0000000000000000000000000000000000000000000000000000000000000118", - "0x0000000000000000000000000000000000000000000000000000000000000119", - "0x000000000000000000000000000000000000000000000000000000000000011a", - "0x000000000000000000000000000000000000000000000000000000000000011b", - "0x000000000000000000000000000000000000000000000000000000000000011c", - "0x000000000000000000000000000000000000000000000000000000000000011d", - "0x000000000000000000000000000000000000000000000000000000000000011e", - "0x000000000000000000000000000000000000000000000000000000000000011f", - "0x0000000000000000000000000000000000000000000000000000000000000120", - "0x0000000000000000000000000000000000000000000000000000000000000121", - "0x0000000000000000000000000000000000000000000000000000000000000122", - "0x0000000000000000000000000000000000000000000000000000000000000123", - "0x0000000000000000000000000000000000000000000000000000000000000124", - "0x0000000000000000000000000000000000000000000000000000000000000125", - "0x0000000000000000000000000000000000000000000000000000000000000126", - "0x0000000000000000000000000000000000000000000000000000000000000127", - "0x0000000000000000000000000000000000000000000000000000000000000128", - "0x0000000000000000000000000000000000000000000000000000000000000129", - "0x000000000000000000000000000000000000000000000000000000000000012a", - "0x000000000000000000000000000000000000000000000000000000000000012b", - "0x000000000000000000000000000000000000000000000000000000000000012c", - "0x000000000000000000000000000000000000000000000000000000000000012d", - "0x000000000000000000000000000000000000000000000000000000000000012e", - "0x000000000000000000000000000000000000000000000000000000000000012f", - "0x0000000000000000000000000000000000000000000000000000000000000130", - "0x0000000000000000000000000000000000000000000000000000000000000131", - "0x0000000000000000000000000000000000000000000000000000000000000132", - "0x0000000000000000000000000000000000000000000000000000000000000133", - "0x0000000000000000000000000000000000000000000000000000000000000134", - "0x0000000000000000000000000000000000000000000000000000000000000135", - "0x0000000000000000000000000000000000000000000000000000000000000136", - "0x0000000000000000000000000000000000000000000000000000000000000137", - "0x0000000000000000000000000000000000000000000000000000000000000138", - "0x0000000000000000000000000000000000000000000000000000000000000139", - "0x000000000000000000000000000000000000000000000000000000000000013a", - "0x000000000000000000000000000000000000000000000000000000000000013b", - "0x000000000000000000000000000000000000000000000000000000000000013c", - "0x000000000000000000000000000000000000000000000000000000000000013d", - "0x000000000000000000000000000000000000000000000000000000000000013e", - "0x000000000000000000000000000000000000000000000000000000000000013f", - "0x0000000000000000000000000000000000000000000000000000000000000140", - "0x0000000000000000000000000000000000000000000000000000000000000141", - "0x0000000000000000000000000000000000000000000000000000000000000142", - "0x0000000000000000000000000000000000000000000000000000000000000143", - "0x0000000000000000000000000000000000000000000000000000000000000144", - "0x0000000000000000000000000000000000000000000000000000000000000145", - "0x0000000000000000000000000000000000000000000000000000000000000146", - "0x0000000000000000000000000000000000000000000000000000000000000147", - "0x0000000000000000000000000000000000000000000000000000000000000148", - "0x0000000000000000000000000000000000000000000000000000000000000149", - "0x000000000000000000000000000000000000000000000000000000000000014a", - "0x000000000000000000000000000000000000000000000000000000000000014b", - "0x000000000000000000000000000000000000000000000000000000000000014c", - "0x000000000000000000000000000000000000000000000000000000000000014d", - "0x000000000000000000000000000000000000000000000000000000000000014e", - "0x000000000000000000000000000000000000000000000000000000000000014f", - "0x0000000000000000000000000000000000000000000000000000000000000150", - "0x0000000000000000000000000000000000000000000000000000000000000151", - "0x0000000000000000000000000000000000000000000000000000000000000152", - "0x0000000000000000000000000000000000000000000000000000000000000153", - "0x0000000000000000000000000000000000000000000000000000000000000154", - "0x0000000000000000000000000000000000000000000000000000000000000155", - "0x0000000000000000000000000000000000000000000000000000000000000156", - "0x0000000000000000000000000000000000000000000000000000000000000157", - "0x0000000000000000000000000000000000000000000000000000000000000158", - "0x0000000000000000000000000000000000000000000000000000000000000159", - "0x000000000000000000000000000000000000000000000000000000000000015a", - "0x000000000000000000000000000000000000000000000000000000000000015b", - "0x000000000000000000000000000000000000000000000000000000000000015c", - "0x000000000000000000000000000000000000000000000000000000000000015d", - "0x000000000000000000000000000000000000000000000000000000000000015e", - "0x000000000000000000000000000000000000000000000000000000000000015f", - "0x0000000000000000000000000000000000000000000000000000000000000160", - "0x0000000000000000000000000000000000000000000000000000000000000161", - "0x0000000000000000000000000000000000000000000000000000000000000162", - "0x0000000000000000000000000000000000000000000000000000000000000163", - "0x0000000000000000000000000000000000000000000000000000000000000164", - "0x0000000000000000000000000000000000000000000000000000000000000165", - "0x0000000000000000000000000000000000000000000000000000000000000166", - "0x0000000000000000000000000000000000000000000000000000000000000167", - "0x0000000000000000000000000000000000000000000000000000000000000168", - "0x0000000000000000000000000000000000000000000000000000000000000169", - "0x000000000000000000000000000000000000000000000000000000000000016a", - "0x000000000000000000000000000000000000000000000000000000000000016b", - "0x000000000000000000000000000000000000000000000000000000000000016c", - "0x000000000000000000000000000000000000000000000000000000000000016d", - "0x000000000000000000000000000000000000000000000000000000000000016e", - "0x000000000000000000000000000000000000000000000000000000000000016f", - "0x0000000000000000000000000000000000000000000000000000000000000170", - "0x0000000000000000000000000000000000000000000000000000000000000171", - "0x0000000000000000000000000000000000000000000000000000000000000172", - "0x0000000000000000000000000000000000000000000000000000000000000173", - "0x0000000000000000000000000000000000000000000000000000000000000174", - "0x0000000000000000000000000000000000000000000000000000000000000175", - "0x0000000000000000000000000000000000000000000000000000000000000176", - "0x0000000000000000000000000000000000000000000000000000000000000177", - "0x0000000000000000000000000000000000000000000000000000000000000178", - "0x0000000000000000000000000000000000000000000000000000000000000179", - "0x000000000000000000000000000000000000000000000000000000000000017a", - "0x000000000000000000000000000000000000000000000000000000000000017b", - "0x000000000000000000000000000000000000000000000000000000000000017c", - "0x000000000000000000000000000000000000000000000000000000000000017d", - "0x000000000000000000000000000000000000000000000000000000000000017e", - "0x000000000000000000000000000000000000000000000000000000000000017f", - "0x0000000000000000000000000000000000000000000000000000000000000180", - "0x0000000000000000000000000000000000000000000000000000000000000181", - "0x0000000000000000000000000000000000000000000000000000000000000182", - "0x0000000000000000000000000000000000000000000000000000000000000183", - "0x0000000000000000000000000000000000000000000000000000000000000184", - "0x0000000000000000000000000000000000000000000000000000000000000185", - "0x0000000000000000000000000000000000000000000000000000000000000186", - "0x0000000000000000000000000000000000000000000000000000000000000187", - "0x0000000000000000000000000000000000000000000000000000000000000188", - "0x0000000000000000000000000000000000000000000000000000000000000189", - "0x000000000000000000000000000000000000000000000000000000000000018a", - "0x000000000000000000000000000000000000000000000000000000000000018b", - "0x000000000000000000000000000000000000000000000000000000000000018c", - "0x000000000000000000000000000000000000000000000000000000000000018d", - "0x000000000000000000000000000000000000000000000000000000000000018e", - "0x000000000000000000000000000000000000000000000000000000000000018f", - "0x0000000000000000000000000000000000000000000000000000000000000190", - "0x0000000000000000000000000000000000000000000000000000000000000191", - "0x0000000000000000000000000000000000000000000000000000000000000192", - "0x0000000000000000000000000000000000000000000000000000000000000193", - "0x0000000000000000000000000000000000000000000000000000000000000194", - "0x0000000000000000000000000000000000000000000000000000000000000195", - "0x0000000000000000000000000000000000000000000000000000000000000196", - "0x0000000000000000000000000000000000000000000000000000000000000197", - "0x0000000000000000000000000000000000000000000000000000000000000198", - "0x0000000000000000000000000000000000000000000000000000000000000199", - "0x000000000000000000000000000000000000000000000000000000000000019a", - "0x000000000000000000000000000000000000000000000000000000000000019b", - "0x000000000000000000000000000000000000000000000000000000000000019c", - "0x000000000000000000000000000000000000000000000000000000000000019d", - "0x000000000000000000000000000000000000000000000000000000000000019e", - "0x000000000000000000000000000000000000000000000000000000000000019f", - "0x00000000000000000000000000000000000000000000000000000000000001a0", - "0x00000000000000000000000000000000000000000000000000000000000001a1", - "0x00000000000000000000000000000000000000000000000000000000000001a2", - "0x00000000000000000000000000000000000000000000000000000000000001a3", - "0x00000000000000000000000000000000000000000000000000000000000001a4", - "0x00000000000000000000000000000000000000000000000000000000000001a5", - "0x00000000000000000000000000000000000000000000000000000000000001a6", - "0x00000000000000000000000000000000000000000000000000000000000001a7", - "0x00000000000000000000000000000000000000000000000000000000000001a8", - "0x00000000000000000000000000000000000000000000000000000000000001a9", - "0x00000000000000000000000000000000000000000000000000000000000001aa", - "0x00000000000000000000000000000000000000000000000000000000000001ab", - "0x00000000000000000000000000000000000000000000000000000000000001ac", - "0x00000000000000000000000000000000000000000000000000000000000001ad", - "0x00000000000000000000000000000000000000000000000000000000000001ae", - "0x00000000000000000000000000000000000000000000000000000000000001af", - "0x00000000000000000000000000000000000000000000000000000000000001b0", - "0x00000000000000000000000000000000000000000000000000000000000001b1", - "0x00000000000000000000000000000000000000000000000000000000000001b2", - "0x00000000000000000000000000000000000000000000000000000000000001b3", - "0x00000000000000000000000000000000000000000000000000000000000001b4", - "0x00000000000000000000000000000000000000000000000000000000000001b5", - "0x00000000000000000000000000000000000000000000000000000000000001b6", - "0x00000000000000000000000000000000000000000000000000000000000001b7", - "0x00000000000000000000000000000000000000000000000000000000000001b8", - "0x00000000000000000000000000000000000000000000000000000000000001b9", - "0x00000000000000000000000000000000000000000000000000000000000001ba", - "0x00000000000000000000000000000000000000000000000000000000000001bb", - "0x00000000000000000000000000000000000000000000000000000000000001bc", - "0x00000000000000000000000000000000000000000000000000000000000001bd", - "0x00000000000000000000000000000000000000000000000000000000000001be", - "0x00000000000000000000000000000000000000000000000000000000000001bf", - "0x00000000000000000000000000000000000000000000000000000000000001c0", - "0x00000000000000000000000000000000000000000000000000000000000001c1", - "0x00000000000000000000000000000000000000000000000000000000000001c2", - "0x00000000000000000000000000000000000000000000000000000000000001c3", - "0x00000000000000000000000000000000000000000000000000000000000001c4", - "0x00000000000000000000000000000000000000000000000000000000000001c5", - "0x00000000000000000000000000000000000000000000000000000000000001c6", - "0x00000000000000000000000000000000000000000000000000000000000001c7", - "0x00000000000000000000000000000000000000000000000000000000000001c8", - "0x00000000000000000000000000000000000000000000000000000000000001c9", - "0x00000000000000000000000000000000000000000000000000000000000001ca", - "0x00000000000000000000000000000000000000000000000000000000000001cb", - "0x00000000000000000000000000000000000000000000000000000000000001cc", - "0x00000000000000000000000000000000000000000000000000000000000001cd", - "0x00000000000000000000000000000000000000000000000000000000000001ce", - "0x00000000000000000000000000000000000000000000000000000000000001cf", - "0x00000000000000000000000000000000000000000000000000000000000001d0", - "0x00000000000000000000000000000000000000000000000000000000000001d1", - "0x00000000000000000000000000000000000000000000000000000000000001d2", - "0x00000000000000000000000000000000000000000000000000000000000001d3", - "0x00000000000000000000000000000000000000000000000000000000000001d4", - "0x00000000000000000000000000000000000000000000000000000000000001d5", - "0x00000000000000000000000000000000000000000000000000000000000001d6", - "0x00000000000000000000000000000000000000000000000000000000000001d7", - "0x00000000000000000000000000000000000000000000000000000000000001d8", - "0x00000000000000000000000000000000000000000000000000000000000001d9", - "0x00000000000000000000000000000000000000000000000000000000000001da", - "0x00000000000000000000000000000000000000000000000000000000000001db", - "0x00000000000000000000000000000000000000000000000000000000000001dc", - "0x00000000000000000000000000000000000000000000000000000000000001dd", - "0x00000000000000000000000000000000000000000000000000000000000001de", - "0x00000000000000000000000000000000000000000000000000000000000001df", - "0x00000000000000000000000000000000000000000000000000000000000001e0", - "0x00000000000000000000000000000000000000000000000000000000000001e1", - "0x00000000000000000000000000000000000000000000000000000000000001e2", - "0x00000000000000000000000000000000000000000000000000000000000001e3", - "0x00000000000000000000000000000000000000000000000000000000000001e4", - "0x00000000000000000000000000000000000000000000000000000000000001e5", - "0x00000000000000000000000000000000000000000000000000000000000001e6", - "0x00000000000000000000000000000000000000000000000000000000000001e7", - "0x00000000000000000000000000000000000000000000000000000000000001e8", - "0x00000000000000000000000000000000000000000000000000000000000001e9", - "0x00000000000000000000000000000000000000000000000000000000000001ea", - "0x00000000000000000000000000000000000000000000000000000000000001eb", - "0x00000000000000000000000000000000000000000000000000000000000001ec", - "0x00000000000000000000000000000000000000000000000000000000000001ed", - "0x00000000000000000000000000000000000000000000000000000000000001ee", - "0x00000000000000000000000000000000000000000000000000000000000001ef", - "0x00000000000000000000000000000000000000000000000000000000000001f0", - "0x00000000000000000000000000000000000000000000000000000000000001f1", - "0x00000000000000000000000000000000000000000000000000000000000001f2", - "0x00000000000000000000000000000000000000000000000000000000000001f3", - "0x00000000000000000000000000000000000000000000000000000000000001f4", - "0x00000000000000000000000000000000000000000000000000000000000001f5", - "0x00000000000000000000000000000000000000000000000000000000000001f6", - "0x00000000000000000000000000000000000000000000000000000000000001f7", - "0x00000000000000000000000000000000000000000000000000000000000001f8", - "0x00000000000000000000000000000000000000000000000000000000000001f9", - "0x00000000000000000000000000000000000000000000000000000000000001fa", - "0x00000000000000000000000000000000000000000000000000000000000001fb", - "0x00000000000000000000000000000000000000000000000000000000000001fc", - "0x00000000000000000000000000000000000000000000000000000000000001fd", - "0x00000000000000000000000000000000000000000000000000000000000001fe", - "0x00000000000000000000000000000000000000000000000000000000000001ff", - "0x0000000000000000000000000000000000000000000000000000000000000200", - "0x0000000000000000000000000000000000000000000000000000000000000201", - "0x0000000000000000000000000000000000000000000000000000000000000202", - "0x0000000000000000000000000000000000000000000000000000000000000203", - "0x0000000000000000000000000000000000000000000000000000000000000204", - "0x0000000000000000000000000000000000000000000000000000000000000205", - "0x0000000000000000000000000000000000000000000000000000000000000206", - "0x0000000000000000000000000000000000000000000000000000000000000207", - "0x0000000000000000000000000000000000000000000000000000000000000208", - "0x0000000000000000000000000000000000000000000000000000000000000209", - "0x000000000000000000000000000000000000000000000000000000000000020a", - "0x000000000000000000000000000000000000000000000000000000000000020b", - "0x000000000000000000000000000000000000000000000000000000000000020c", - "0x000000000000000000000000000000000000000000000000000000000000020d", - "0x000000000000000000000000000000000000000000000000000000000000020e", - "0x000000000000000000000000000000000000000000000000000000000000020f", - "0x0000000000000000000000000000000000000000000000000000000000000210", - "0x0000000000000000000000000000000000000000000000000000000000000211", - "0x0000000000000000000000000000000000000000000000000000000000000212", - "0x0000000000000000000000000000000000000000000000000000000000000213", - "0x0000000000000000000000000000000000000000000000000000000000000214", - "0x0000000000000000000000000000000000000000000000000000000000000215", - "0x0000000000000000000000000000000000000000000000000000000000000216", - "0x0000000000000000000000000000000000000000000000000000000000000217", - "0x0000000000000000000000000000000000000000000000000000000000000218", - "0x0000000000000000000000000000000000000000000000000000000000000219", - "0x000000000000000000000000000000000000000000000000000000000000021a", - "0x000000000000000000000000000000000000000000000000000000000000021b", - "0x000000000000000000000000000000000000000000000000000000000000021c", - "0x000000000000000000000000000000000000000000000000000000000000021d", - "0x000000000000000000000000000000000000000000000000000000000000021e", - "0x000000000000000000000000000000000000000000000000000000000000021f", - "0x0000000000000000000000000000000000000000000000000000000000000220", - "0x0000000000000000000000000000000000000000000000000000000000000221", - "0x0000000000000000000000000000000000000000000000000000000000000222", - "0x0000000000000000000000000000000000000000000000000000000000000223", - "0x0000000000000000000000000000000000000000000000000000000000000224", - "0x0000000000000000000000000000000000000000000000000000000000000225", - "0x0000000000000000000000000000000000000000000000000000000000000226", - "0x0000000000000000000000000000000000000000000000000000000000000227", - "0x0000000000000000000000000000000000000000000000000000000000000228", - "0x0000000000000000000000000000000000000000000000000000000000000229", - "0x000000000000000000000000000000000000000000000000000000000000022a", - "0x000000000000000000000000000000000000000000000000000000000000022b", - "0x000000000000000000000000000000000000000000000000000000000000022c", - "0x000000000000000000000000000000000000000000000000000000000000022d", - "0x000000000000000000000000000000000000000000000000000000000000022e", - "0x000000000000000000000000000000000000000000000000000000000000022f", - "0x0000000000000000000000000000000000000000000000000000000000000230", - "0x0000000000000000000000000000000000000000000000000000000000000231", - "0x0000000000000000000000000000000000000000000000000000000000000232", - "0x0000000000000000000000000000000000000000000000000000000000000233", - "0x0000000000000000000000000000000000000000000000000000000000000234", - "0x0000000000000000000000000000000000000000000000000000000000000235", - "0x0000000000000000000000000000000000000000000000000000000000000236", - "0x0000000000000000000000000000000000000000000000000000000000000237", - "0x0000000000000000000000000000000000000000000000000000000000000238", - "0x0000000000000000000000000000000000000000000000000000000000000239", - "0x000000000000000000000000000000000000000000000000000000000000023a", - "0x000000000000000000000000000000000000000000000000000000000000023b", - "0x000000000000000000000000000000000000000000000000000000000000023c", - "0x000000000000000000000000000000000000000000000000000000000000023d", - "0x000000000000000000000000000000000000000000000000000000000000023e", - "0x000000000000000000000000000000000000000000000000000000000000023f", - "0x0000000000000000000000000000000000000000000000000000000000000240", - "0x0000000000000000000000000000000000000000000000000000000000000241", - "0x0000000000000000000000000000000000000000000000000000000000000242", - "0x0000000000000000000000000000000000000000000000000000000000000243", - "0x0000000000000000000000000000000000000000000000000000000000000244", - "0x0000000000000000000000000000000000000000000000000000000000000245", - "0x0000000000000000000000000000000000000000000000000000000000000246", - "0x0000000000000000000000000000000000000000000000000000000000000247", - "0x0000000000000000000000000000000000000000000000000000000000000248", - "0x0000000000000000000000000000000000000000000000000000000000000249", - "0x000000000000000000000000000000000000000000000000000000000000024a", - "0x000000000000000000000000000000000000000000000000000000000000024b", - "0x000000000000000000000000000000000000000000000000000000000000024c", - "0x000000000000000000000000000000000000000000000000000000000000024d", - "0x000000000000000000000000000000000000000000000000000000000000024e", - "0x000000000000000000000000000000000000000000000000000000000000024f", - "0x0000000000000000000000000000000000000000000000000000000000000250", - "0x0000000000000000000000000000000000000000000000000000000000000251", - "0x0000000000000000000000000000000000000000000000000000000000000252", - "0x0000000000000000000000000000000000000000000000000000000000000253", - "0x0000000000000000000000000000000000000000000000000000000000000254", - "0x0000000000000000000000000000000000000000000000000000000000000255", - "0x0000000000000000000000000000000000000000000000000000000000000256", - "0x0000000000000000000000000000000000000000000000000000000000000257", - "0x0000000000000000000000000000000000000000000000000000000000000258", - "0x0000000000000000000000000000000000000000000000000000000000000259", - "0x000000000000000000000000000000000000000000000000000000000000025a", - "0x000000000000000000000000000000000000000000000000000000000000025b", - "0x000000000000000000000000000000000000000000000000000000000000025c", - "0x000000000000000000000000000000000000000000000000000000000000025d", - "0x000000000000000000000000000000000000000000000000000000000000025e", - "0x000000000000000000000000000000000000000000000000000000000000025f", - "0x0000000000000000000000000000000000000000000000000000000000000260", - "0x0000000000000000000000000000000000000000000000000000000000000261", - "0x0000000000000000000000000000000000000000000000000000000000000262", - "0x0000000000000000000000000000000000000000000000000000000000000263", - "0x0000000000000000000000000000000000000000000000000000000000000264", - "0x0000000000000000000000000000000000000000000000000000000000000265", - "0x0000000000000000000000000000000000000000000000000000000000000266", - "0x0000000000000000000000000000000000000000000000000000000000000267", - "0x0000000000000000000000000000000000000000000000000000000000000268", - "0x0000000000000000000000000000000000000000000000000000000000000269", - "0x000000000000000000000000000000000000000000000000000000000000026a", - "0x000000000000000000000000000000000000000000000000000000000000026b", - "0x000000000000000000000000000000000000000000000000000000000000026c", - "0x000000000000000000000000000000000000000000000000000000000000026d", - "0x000000000000000000000000000000000000000000000000000000000000026e", - "0x000000000000000000000000000000000000000000000000000000000000026f", - "0x0000000000000000000000000000000000000000000000000000000000000270", - "0x0000000000000000000000000000000000000000000000000000000000000271", - "0x0000000000000000000000000000000000000000000000000000000000000272", - "0x0000000000000000000000000000000000000000000000000000000000000273", - "0x0000000000000000000000000000000000000000000000000000000000000274", - "0x0000000000000000000000000000000000000000000000000000000000000275", - "0x0000000000000000000000000000000000000000000000000000000000000276", - "0x0000000000000000000000000000000000000000000000000000000000000277", - "0x0000000000000000000000000000000000000000000000000000000000000278", - "0x0000000000000000000000000000000000000000000000000000000000000279", - "0x000000000000000000000000000000000000000000000000000000000000027a", - "0x000000000000000000000000000000000000000000000000000000000000027b", - "0x000000000000000000000000000000000000000000000000000000000000027c", - "0x000000000000000000000000000000000000000000000000000000000000027d", - "0x000000000000000000000000000000000000000000000000000000000000027e", - "0x000000000000000000000000000000000000000000000000000000000000027f", - "0x0000000000000000000000000000000000000000000000000000000000000280", - "0x0000000000000000000000000000000000000000000000000000000000000281", - "0x0000000000000000000000000000000000000000000000000000000000000282", - "0x0000000000000000000000000000000000000000000000000000000000000283", - "0x0000000000000000000000000000000000000000000000000000000000000284", - "0x0000000000000000000000000000000000000000000000000000000000000285", - "0x0000000000000000000000000000000000000000000000000000000000000286", - "0x0000000000000000000000000000000000000000000000000000000000000287", - "0x0000000000000000000000000000000000000000000000000000000000000288", - "0x0000000000000000000000000000000000000000000000000000000000000289", - "0x000000000000000000000000000000000000000000000000000000000000028a", - "0x000000000000000000000000000000000000000000000000000000000000028b", - "0x000000000000000000000000000000000000000000000000000000000000028c", - "0x000000000000000000000000000000000000000000000000000000000000028d", - "0x000000000000000000000000000000000000000000000000000000000000028e", - "0x000000000000000000000000000000000000000000000000000000000000028f", - "0x0000000000000000000000000000000000000000000000000000000000000290", - "0x0000000000000000000000000000000000000000000000000000000000000291", - "0x0000000000000000000000000000000000000000000000000000000000000292", - "0x0000000000000000000000000000000000000000000000000000000000000293", - "0x0000000000000000000000000000000000000000000000000000000000000294", - "0x0000000000000000000000000000000000000000000000000000000000000295", - "0x0000000000000000000000000000000000000000000000000000000000000296", - "0x0000000000000000000000000000000000000000000000000000000000000297", - "0x0000000000000000000000000000000000000000000000000000000000000298", - "0x0000000000000000000000000000000000000000000000000000000000000299", - "0x000000000000000000000000000000000000000000000000000000000000029a", - "0x000000000000000000000000000000000000000000000000000000000000029b", - "0x000000000000000000000000000000000000000000000000000000000000029c", - "0x000000000000000000000000000000000000000000000000000000000000029d", - "0x000000000000000000000000000000000000000000000000000000000000029e", - "0x000000000000000000000000000000000000000000000000000000000000029f", - "0x00000000000000000000000000000000000000000000000000000000000002a0", - "0x00000000000000000000000000000000000000000000000000000000000002a1", - "0x00000000000000000000000000000000000000000000000000000000000002a2", - "0x00000000000000000000000000000000000000000000000000000000000002a3", - "0x00000000000000000000000000000000000000000000000000000000000002a4", - "0x00000000000000000000000000000000000000000000000000000000000002a5", - "0x00000000000000000000000000000000000000000000000000000000000002a6", - "0x00000000000000000000000000000000000000000000000000000000000002a7", - "0x00000000000000000000000000000000000000000000000000000000000002a8", - "0x00000000000000000000000000000000000000000000000000000000000002a9", - "0x00000000000000000000000000000000000000000000000000000000000002aa", - "0x00000000000000000000000000000000000000000000000000000000000002ab", - "0x00000000000000000000000000000000000000000000000000000000000002ac", - "0x00000000000000000000000000000000000000000000000000000000000002ad", - "0x00000000000000000000000000000000000000000000000000000000000002ae", - "0x00000000000000000000000000000000000000000000000000000000000002af", - "0x00000000000000000000000000000000000000000000000000000000000002b0", - "0x00000000000000000000000000000000000000000000000000000000000002b1", - "0x00000000000000000000000000000000000000000000000000000000000002b2", - "0x00000000000000000000000000000000000000000000000000000000000002b3", - "0x00000000000000000000000000000000000000000000000000000000000002b4", - "0x00000000000000000000000000000000000000000000000000000000000002b5", - "0x00000000000000000000000000000000000000000000000000000000000002b6", - "0x00000000000000000000000000000000000000000000000000000000000002b7", - "0x00000000000000000000000000000000000000000000000000000000000002b8", - "0x00000000000000000000000000000000000000000000000000000000000002b9", - "0x00000000000000000000000000000000000000000000000000000000000002ba", - "0x00000000000000000000000000000000000000000000000000000000000002bb", - "0x00000000000000000000000000000000000000000000000000000000000002bc", - "0x00000000000000000000000000000000000000000000000000000000000002bd", - "0x00000000000000000000000000000000000000000000000000000000000002be", - "0x00000000000000000000000000000000000000000000000000000000000002bf", - "0x00000000000000000000000000000000000000000000000000000000000002c0", - "0x00000000000000000000000000000000000000000000000000000000000002c1", - "0x00000000000000000000000000000000000000000000000000000000000002c2", - "0x00000000000000000000000000000000000000000000000000000000000002c3", - "0x00000000000000000000000000000000000000000000000000000000000002c4", - "0x00000000000000000000000000000000000000000000000000000000000002c5", - "0x00000000000000000000000000000000000000000000000000000000000002c6", - "0x00000000000000000000000000000000000000000000000000000000000002c7", - "0x00000000000000000000000000000000000000000000000000000000000002c8", - "0x00000000000000000000000000000000000000000000000000000000000002c9", - "0x00000000000000000000000000000000000000000000000000000000000002ca", - "0x00000000000000000000000000000000000000000000000000000000000002cb", - "0x00000000000000000000000000000000000000000000000000000000000002cc", - "0x00000000000000000000000000000000000000000000000000000000000002cd", - "0x00000000000000000000000000000000000000000000000000000000000002ce", - "0x00000000000000000000000000000000000000000000000000000000000002cf", - "0x00000000000000000000000000000000000000000000000000000000000002d0", - "0x00000000000000000000000000000000000000000000000000000000000002d1", - "0x00000000000000000000000000000000000000000000000000000000000002d2", - "0x00000000000000000000000000000000000000000000000000000000000002d3", - "0x00000000000000000000000000000000000000000000000000000000000002d4", - "0x00000000000000000000000000000000000000000000000000000000000002d5", - "0x00000000000000000000000000000000000000000000000000000000000002d6", - "0x00000000000000000000000000000000000000000000000000000000000002d7", - "0x00000000000000000000000000000000000000000000000000000000000002d8", - "0x00000000000000000000000000000000000000000000000000000000000002d9", - "0x00000000000000000000000000000000000000000000000000000000000002da", - "0x00000000000000000000000000000000000000000000000000000000000002db", - "0x00000000000000000000000000000000000000000000000000000000000002dc", - "0x00000000000000000000000000000000000000000000000000000000000002dd", - "0x00000000000000000000000000000000000000000000000000000000000002de", - "0x00000000000000000000000000000000000000000000000000000000000002df", - "0x00000000000000000000000000000000000000000000000000000000000002e0", - "0x00000000000000000000000000000000000000000000000000000000000002e1", - "0x00000000000000000000000000000000000000000000000000000000000002e2", - "0x00000000000000000000000000000000000000000000000000000000000002e3", - "0x00000000000000000000000000000000000000000000000000000000000002e4", - "0x00000000000000000000000000000000000000000000000000000000000002e5", - "0x00000000000000000000000000000000000000000000000000000000000002e6", - "0x00000000000000000000000000000000000000000000000000000000000002e7", - "0x00000000000000000000000000000000000000000000000000000000000002e8", - "0x00000000000000000000000000000000000000000000000000000000000002e9", - "0x00000000000000000000000000000000000000000000000000000000000002ea", - "0x00000000000000000000000000000000000000000000000000000000000002eb", - "0x00000000000000000000000000000000000000000000000000000000000002ec", - "0x00000000000000000000000000000000000000000000000000000000000002ed", - "0x00000000000000000000000000000000000000000000000000000000000002ee", - "0x00000000000000000000000000000000000000000000000000000000000002ef", - "0x00000000000000000000000000000000000000000000000000000000000002f0", - "0x00000000000000000000000000000000000000000000000000000000000002f1", - "0x00000000000000000000000000000000000000000000000000000000000002f2", - "0x00000000000000000000000000000000000000000000000000000000000002f3", - "0x00000000000000000000000000000000000000000000000000000000000002f4", - "0x00000000000000000000000000000000000000000000000000000000000002f5", - "0x00000000000000000000000000000000000000000000000000000000000002f6", - "0x00000000000000000000000000000000000000000000000000000000000002f7", - "0x00000000000000000000000000000000000000000000000000000000000002f8", - "0x00000000000000000000000000000000000000000000000000000000000002f9", - "0x00000000000000000000000000000000000000000000000000000000000002fa", - "0x00000000000000000000000000000000000000000000000000000000000002fb", - "0x00000000000000000000000000000000000000000000000000000000000002fc", - "0x00000000000000000000000000000000000000000000000000000000000002fd", - "0x00000000000000000000000000000000000000000000000000000000000002fe", - "0x00000000000000000000000000000000000000000000000000000000000002ff", - "0x0000000000000000000000000000000000000000000000000000000000000300", - "0x0000000000000000000000000000000000000000000000000000000000000301", - "0x0000000000000000000000000000000000000000000000000000000000000302", - "0x0000000000000000000000000000000000000000000000000000000000000303", - "0x0000000000000000000000000000000000000000000000000000000000000304", - "0x0000000000000000000000000000000000000000000000000000000000000305", - "0x0000000000000000000000000000000000000000000000000000000000000306", - "0x0000000000000000000000000000000000000000000000000000000000000307", - "0x0000000000000000000000000000000000000000000000000000000000000308", - "0x0000000000000000000000000000000000000000000000000000000000000309", - "0x000000000000000000000000000000000000000000000000000000000000030a", - "0x000000000000000000000000000000000000000000000000000000000000030b", - "0x000000000000000000000000000000000000000000000000000000000000030c", - "0x000000000000000000000000000000000000000000000000000000000000030d", - "0x000000000000000000000000000000000000000000000000000000000000030e", - "0x000000000000000000000000000000000000000000000000000000000000030f", - "0x0000000000000000000000000000000000000000000000000000000000000310", - "0x0000000000000000000000000000000000000000000000000000000000000311", - "0x0000000000000000000000000000000000000000000000000000000000000312", - "0x0000000000000000000000000000000000000000000000000000000000000313", - "0x0000000000000000000000000000000000000000000000000000000000000314", - "0x0000000000000000000000000000000000000000000000000000000000000315", - "0x0000000000000000000000000000000000000000000000000000000000000316", - "0x0000000000000000000000000000000000000000000000000000000000000317", - "0x0000000000000000000000000000000000000000000000000000000000000318", - "0x0000000000000000000000000000000000000000000000000000000000000319", - "0x000000000000000000000000000000000000000000000000000000000000031a", - "0x000000000000000000000000000000000000000000000000000000000000031b", - "0x000000000000000000000000000000000000000000000000000000000000031c", - "0x000000000000000000000000000000000000000000000000000000000000031d", - "0x000000000000000000000000000000000000000000000000000000000000031e", - "0x000000000000000000000000000000000000000000000000000000000000031f", - "0x0000000000000000000000000000000000000000000000000000000000000320", - "0x0000000000000000000000000000000000000000000000000000000000000321", - "0x0000000000000000000000000000000000000000000000000000000000000322", - "0x0000000000000000000000000000000000000000000000000000000000000323", - "0x0000000000000000000000000000000000000000000000000000000000000324", - "0x0000000000000000000000000000000000000000000000000000000000000325", - "0x0000000000000000000000000000000000000000000000000000000000000326", - "0x0000000000000000000000000000000000000000000000000000000000000327", - "0x0000000000000000000000000000000000000000000000000000000000000328", - "0x0000000000000000000000000000000000000000000000000000000000000329", - "0x000000000000000000000000000000000000000000000000000000000000032a", - "0x000000000000000000000000000000000000000000000000000000000000032b", - "0x000000000000000000000000000000000000000000000000000000000000032c", - "0x000000000000000000000000000000000000000000000000000000000000032d", - "0x000000000000000000000000000000000000000000000000000000000000032e", - "0x000000000000000000000000000000000000000000000000000000000000032f", - "0x0000000000000000000000000000000000000000000000000000000000000330", - "0x0000000000000000000000000000000000000000000000000000000000000331", - "0x0000000000000000000000000000000000000000000000000000000000000332", - "0x0000000000000000000000000000000000000000000000000000000000000333", - "0x0000000000000000000000000000000000000000000000000000000000000334", - "0x0000000000000000000000000000000000000000000000000000000000000335", - "0x0000000000000000000000000000000000000000000000000000000000000336", - "0x0000000000000000000000000000000000000000000000000000000000000337", - "0x0000000000000000000000000000000000000000000000000000000000000338", - "0x0000000000000000000000000000000000000000000000000000000000000339", - "0x000000000000000000000000000000000000000000000000000000000000033a", - "0x000000000000000000000000000000000000000000000000000000000000033b", - "0x000000000000000000000000000000000000000000000000000000000000033c", - "0x000000000000000000000000000000000000000000000000000000000000033d", - "0x000000000000000000000000000000000000000000000000000000000000033e", - "0x000000000000000000000000000000000000000000000000000000000000033f", - "0x0000000000000000000000000000000000000000000000000000000000000340", - "0x0000000000000000000000000000000000000000000000000000000000000341", - "0x0000000000000000000000000000000000000000000000000000000000000342", - "0x0000000000000000000000000000000000000000000000000000000000000343", - "0x0000000000000000000000000000000000000000000000000000000000000344", - "0x0000000000000000000000000000000000000000000000000000000000000345", - "0x0000000000000000000000000000000000000000000000000000000000000346", - "0x0000000000000000000000000000000000000000000000000000000000000347", - "0x0000000000000000000000000000000000000000000000000000000000000348", - "0x0000000000000000000000000000000000000000000000000000000000000349", - "0x000000000000000000000000000000000000000000000000000000000000034a", - "0x000000000000000000000000000000000000000000000000000000000000034b", - "0x000000000000000000000000000000000000000000000000000000000000034c", - "0x000000000000000000000000000000000000000000000000000000000000034d", - "0x000000000000000000000000000000000000000000000000000000000000034e", - "0x000000000000000000000000000000000000000000000000000000000000034f", - "0x0000000000000000000000000000000000000000000000000000000000000350", - "0x0000000000000000000000000000000000000000000000000000000000000351", - "0x0000000000000000000000000000000000000000000000000000000000000352", - "0x0000000000000000000000000000000000000000000000000000000000000353", - "0x0000000000000000000000000000000000000000000000000000000000000354", - "0x0000000000000000000000000000000000000000000000000000000000000355", - "0x0000000000000000000000000000000000000000000000000000000000000356", - "0x0000000000000000000000000000000000000000000000000000000000000357", - "0x0000000000000000000000000000000000000000000000000000000000000358", - "0x0000000000000000000000000000000000000000000000000000000000000359", - "0x000000000000000000000000000000000000000000000000000000000000035a", - "0x000000000000000000000000000000000000000000000000000000000000035b", - "0x000000000000000000000000000000000000000000000000000000000000035c", - "0x000000000000000000000000000000000000000000000000000000000000035d", - "0x000000000000000000000000000000000000000000000000000000000000035e", - "0x000000000000000000000000000000000000000000000000000000000000035f", - "0x0000000000000000000000000000000000000000000000000000000000000360", - "0x0000000000000000000000000000000000000000000000000000000000000361", - "0x0000000000000000000000000000000000000000000000000000000000000362", - "0x0000000000000000000000000000000000000000000000000000000000000363", - "0x0000000000000000000000000000000000000000000000000000000000000364", - "0x0000000000000000000000000000000000000000000000000000000000000365", - "0x0000000000000000000000000000000000000000000000000000000000000366", - "0x0000000000000000000000000000000000000000000000000000000000000367", - "0x0000000000000000000000000000000000000000000000000000000000000368", - "0x0000000000000000000000000000000000000000000000000000000000000369", - "0x000000000000000000000000000000000000000000000000000000000000036a", - "0x000000000000000000000000000000000000000000000000000000000000036b", - "0x000000000000000000000000000000000000000000000000000000000000036c", - "0x000000000000000000000000000000000000000000000000000000000000036d", - "0x000000000000000000000000000000000000000000000000000000000000036e", - "0x000000000000000000000000000000000000000000000000000000000000036f", - "0x0000000000000000000000000000000000000000000000000000000000000370", - "0x0000000000000000000000000000000000000000000000000000000000000371", - "0x0000000000000000000000000000000000000000000000000000000000000372", - "0x0000000000000000000000000000000000000000000000000000000000000373", - "0x0000000000000000000000000000000000000000000000000000000000000374", - "0x0000000000000000000000000000000000000000000000000000000000000375", - "0x0000000000000000000000000000000000000000000000000000000000000376", - "0x0000000000000000000000000000000000000000000000000000000000000377", - "0x0000000000000000000000000000000000000000000000000000000000000378", - "0x0000000000000000000000000000000000000000000000000000000000000379", - "0x000000000000000000000000000000000000000000000000000000000000037a", - "0x000000000000000000000000000000000000000000000000000000000000037b", - "0x000000000000000000000000000000000000000000000000000000000000037c", - "0x000000000000000000000000000000000000000000000000000000000000037d", - "0x000000000000000000000000000000000000000000000000000000000000037e", - "0x000000000000000000000000000000000000000000000000000000000000037f", - "0x0000000000000000000000000000000000000000000000000000000000000380", - "0x0000000000000000000000000000000000000000000000000000000000000381", - "0x0000000000000000000000000000000000000000000000000000000000000382", - "0x0000000000000000000000000000000000000000000000000000000000000383", - "0x0000000000000000000000000000000000000000000000000000000000000384", - "0x0000000000000000000000000000000000000000000000000000000000000385", - "0x0000000000000000000000000000000000000000000000000000000000000386", - "0x0000000000000000000000000000000000000000000000000000000000000387", - "0x0000000000000000000000000000000000000000000000000000000000000388", - "0x0000000000000000000000000000000000000000000000000000000000000389", - "0x000000000000000000000000000000000000000000000000000000000000038a", - "0x000000000000000000000000000000000000000000000000000000000000038b", - "0x000000000000000000000000000000000000000000000000000000000000038c", - "0x000000000000000000000000000000000000000000000000000000000000038d", - "0x000000000000000000000000000000000000000000000000000000000000038e", - "0x000000000000000000000000000000000000000000000000000000000000038f", - "0x0000000000000000000000000000000000000000000000000000000000000390", - "0x0000000000000000000000000000000000000000000000000000000000000391", - "0x0000000000000000000000000000000000000000000000000000000000000392", - "0x0000000000000000000000000000000000000000000000000000000000000393", - "0x0000000000000000000000000000000000000000000000000000000000000394", - "0x0000000000000000000000000000000000000000000000000000000000000395", - "0x0000000000000000000000000000000000000000000000000000000000000396", - "0x0000000000000000000000000000000000000000000000000000000000000397", - "0x0000000000000000000000000000000000000000000000000000000000000398", - "0x0000000000000000000000000000000000000000000000000000000000000399", - "0x000000000000000000000000000000000000000000000000000000000000039a", - "0x000000000000000000000000000000000000000000000000000000000000039b", - "0x000000000000000000000000000000000000000000000000000000000000039c", - "0x000000000000000000000000000000000000000000000000000000000000039d", - "0x000000000000000000000000000000000000000000000000000000000000039e", - "0x000000000000000000000000000000000000000000000000000000000000039f", - "0x00000000000000000000000000000000000000000000000000000000000003a0", - "0x00000000000000000000000000000000000000000000000000000000000003a1", - "0x00000000000000000000000000000000000000000000000000000000000003a2", - "0x00000000000000000000000000000000000000000000000000000000000003a3", - "0x00000000000000000000000000000000000000000000000000000000000003a4", - "0x00000000000000000000000000000000000000000000000000000000000003a5", - "0x00000000000000000000000000000000000000000000000000000000000003a6", - "0x00000000000000000000000000000000000000000000000000000000000003a7", - "0x00000000000000000000000000000000000000000000000000000000000003a8", - "0x00000000000000000000000000000000000000000000000000000000000003a9", - "0x00000000000000000000000000000000000000000000000000000000000003aa", - "0x00000000000000000000000000000000000000000000000000000000000003ab", - "0x00000000000000000000000000000000000000000000000000000000000003ac", - "0x00000000000000000000000000000000000000000000000000000000000003ad", - "0x00000000000000000000000000000000000000000000000000000000000003ae", - "0x00000000000000000000000000000000000000000000000000000000000003af", - "0x00000000000000000000000000000000000000000000000000000000000003b0", - "0x00000000000000000000000000000000000000000000000000000000000003b1", - "0x00000000000000000000000000000000000000000000000000000000000003b2", - "0x00000000000000000000000000000000000000000000000000000000000003b3", - "0x00000000000000000000000000000000000000000000000000000000000003b4", - "0x00000000000000000000000000000000000000000000000000000000000003b5", - "0x00000000000000000000000000000000000000000000000000000000000003b6", - "0x00000000000000000000000000000000000000000000000000000000000003b7", - "0x00000000000000000000000000000000000000000000000000000000000003b8", - "0x00000000000000000000000000000000000000000000000000000000000003b9", - "0x00000000000000000000000000000000000000000000000000000000000003ba", - "0x00000000000000000000000000000000000000000000000000000000000003bb", - "0x00000000000000000000000000000000000000000000000000000000000003bc", - "0x00000000000000000000000000000000000000000000000000000000000003bd", - "0x00000000000000000000000000000000000000000000000000000000000003be", - "0x00000000000000000000000000000000000000000000000000000000000003bf", - "0x00000000000000000000000000000000000000000000000000000000000003c0", - "0x00000000000000000000000000000000000000000000000000000000000003c1", - "0x00000000000000000000000000000000000000000000000000000000000003c2", - "0x00000000000000000000000000000000000000000000000000000000000003c3", - "0x00000000000000000000000000000000000000000000000000000000000003c4", - "0x00000000000000000000000000000000000000000000000000000000000003c5", - "0x00000000000000000000000000000000000000000000000000000000000003c6", - "0x00000000000000000000000000000000000000000000000000000000000003c7", - "0x00000000000000000000000000000000000000000000000000000000000003c8", - "0x00000000000000000000000000000000000000000000000000000000000003c9", - "0x00000000000000000000000000000000000000000000000000000000000003ca", - "0x00000000000000000000000000000000000000000000000000000000000003cb", - "0x00000000000000000000000000000000000000000000000000000000000003cc", - "0x00000000000000000000000000000000000000000000000000000000000003cd", - "0x00000000000000000000000000000000000000000000000000000000000003ce", - "0x00000000000000000000000000000000000000000000000000000000000003cf", - "0x00000000000000000000000000000000000000000000000000000000000003d0", - "0x00000000000000000000000000000000000000000000000000000000000003d1", - "0x00000000000000000000000000000000000000000000000000000000000003d2", - "0x00000000000000000000000000000000000000000000000000000000000003d3", - "0x00000000000000000000000000000000000000000000000000000000000003d4", - "0x00000000000000000000000000000000000000000000000000000000000003d5", - "0x00000000000000000000000000000000000000000000000000000000000003d6", - "0x00000000000000000000000000000000000000000000000000000000000003d7", - "0x00000000000000000000000000000000000000000000000000000000000003d8", - "0x00000000000000000000000000000000000000000000000000000000000003d9", - "0x00000000000000000000000000000000000000000000000000000000000003da", - "0x00000000000000000000000000000000000000000000000000000000000003db", - "0x00000000000000000000000000000000000000000000000000000000000003dc", - "0x00000000000000000000000000000000000000000000000000000000000003dd", - "0x00000000000000000000000000000000000000000000000000000000000003de", - "0x00000000000000000000000000000000000000000000000000000000000003df", - "0x00000000000000000000000000000000000000000000000000000000000003e0", - "0x00000000000000000000000000000000000000000000000000000000000003e1", - "0x00000000000000000000000000000000000000000000000000000000000003e2", - "0x00000000000000000000000000000000000000000000000000000000000003e3", - "0x00000000000000000000000000000000000000000000000000000000000003e4", - "0x00000000000000000000000000000000000000000000000000000000000003e5", - "0x00000000000000000000000000000000000000000000000000000000000003e6", - "0x00000000000000000000000000000000000000000000000000000000000003e7", - "0x00000000000000000000000000000000000000000000000000000000000003e8" - ], - "epoch": 10157 -} diff --git a/overridden_contracts/test/snowbridge-data/test_vector_message_validator_400.json b/overridden_contracts/test/snowbridge-data/test_vector_message_validator_400.json deleted file mode 100644 index 77eb391..0000000 --- a/overridden_contracts/test/snowbridge-data/test_vector_message_validator_400.json +++ /dev/null @@ -1,406 +0,0 @@ -{ - "payload": "0x7015003800004106000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000780000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000880000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008e000000000000000000000000000000000000000000000000000000000000008f0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000b500000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000c700000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000de00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000e200000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000e900000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000f700000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000001020000000000000000000000000000000000000000000000000000000000000103000000000000000000000000000000000000000000000000000000000000010400000000000000000000000000000000000000000000000000000000000001050000000000000000000000000000000000000000000000000000000000000106000000000000000000000000000000000000000000000000000000000000010700000000000000000000000000000000000000000000000000000000000001080000000000000000000000000000000000000000000000000000000000000109000000000000000000000000000000000000000000000000000000000000010a000000000000000000000000000000000000000000000000000000000000010b000000000000000000000000000000000000000000000000000000000000010c000000000000000000000000000000000000000000000000000000000000010d000000000000000000000000000000000000000000000000000000000000010e000000000000000000000000000000000000000000000000000000000000010f0000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000011100000000000000000000000000000000000000000000000000000000000001120000000000000000000000000000000000000000000000000000000000000113000000000000000000000000000000000000000000000000000000000000011400000000000000000000000000000000000000000000000000000000000001150000000000000000000000000000000000000000000000000000000000000116000000000000000000000000000000000000000000000000000000000000011700000000000000000000000000000000000000000000000000000000000001180000000000000000000000000000000000000000000000000000000000000119000000000000000000000000000000000000000000000000000000000000011a000000000000000000000000000000000000000000000000000000000000011b000000000000000000000000000000000000000000000000000000000000011c000000000000000000000000000000000000000000000000000000000000011d000000000000000000000000000000000000000000000000000000000000011e000000000000000000000000000000000000000000000000000000000000011f0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000012100000000000000000000000000000000000000000000000000000000000001220000000000000000000000000000000000000000000000000000000000000123000000000000000000000000000000000000000000000000000000000000012400000000000000000000000000000000000000000000000000000000000001250000000000000000000000000000000000000000000000000000000000000126000000000000000000000000000000000000000000000000000000000000012700000000000000000000000000000000000000000000000000000000000001280000000000000000000000000000000000000000000000000000000000000129000000000000000000000000000000000000000000000000000000000000012a000000000000000000000000000000000000000000000000000000000000012b000000000000000000000000000000000000000000000000000000000000012c000000000000000000000000000000000000000000000000000000000000012d000000000000000000000000000000000000000000000000000000000000012e000000000000000000000000000000000000000000000000000000000000012f0000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000001320000000000000000000000000000000000000000000000000000000000000133000000000000000000000000000000000000000000000000000000000000013400000000000000000000000000000000000000000000000000000000000001350000000000000000000000000000000000000000000000000000000000000136000000000000000000000000000000000000000000000000000000000000013700000000000000000000000000000000000000000000000000000000000001380000000000000000000000000000000000000000000000000000000000000139000000000000000000000000000000000000000000000000000000000000013a000000000000000000000000000000000000000000000000000000000000013b000000000000000000000000000000000000000000000000000000000000013c000000000000000000000000000000000000000000000000000000000000013d000000000000000000000000000000000000000000000000000000000000013e000000000000000000000000000000000000000000000000000000000000013f0000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000014400000000000000000000000000000000000000000000000000000000000001450000000000000000000000000000000000000000000000000000000000000146000000000000000000000000000000000000000000000000000000000000014700000000000000000000000000000000000000000000000000000000000001480000000000000000000000000000000000000000000000000000000000000149000000000000000000000000000000000000000000000000000000000000014a000000000000000000000000000000000000000000000000000000000000014b000000000000000000000000000000000000000000000000000000000000014c000000000000000000000000000000000000000000000000000000000000014d000000000000000000000000000000000000000000000000000000000000014e000000000000000000000000000000000000000000000000000000000000014f0000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000015100000000000000000000000000000000000000000000000000000000000001520000000000000000000000000000000000000000000000000000000000000153000000000000000000000000000000000000000000000000000000000000015400000000000000000000000000000000000000000000000000000000000001550000000000000000000000000000000000000000000000000000000000000156000000000000000000000000000000000000000000000000000000000000015700000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000159000000000000000000000000000000000000000000000000000000000000015a000000000000000000000000000000000000000000000000000000000000015b000000000000000000000000000000000000000000000000000000000000015c000000000000000000000000000000000000000000000000000000000000015d000000000000000000000000000000000000000000000000000000000000015e000000000000000000000000000000000000000000000000000000000000015f0000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000016100000000000000000000000000000000000000000000000000000000000001620000000000000000000000000000000000000000000000000000000000000163000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000001650000000000000000000000000000000000000000000000000000000000000166000000000000000000000000000000000000000000000000000000000000016700000000000000000000000000000000000000000000000000000000000001680000000000000000000000000000000000000000000000000000000000000169000000000000000000000000000000000000000000000000000000000000016a000000000000000000000000000000000000000000000000000000000000016b000000000000000000000000000000000000000000000000000000000000016c000000000000000000000000000000000000000000000000000000000000016d000000000000000000000000000000000000000000000000000000000000016e000000000000000000000000000000000000000000000000000000000000016f0000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000017100000000000000000000000000000000000000000000000000000000000001720000000000000000000000000000000000000000000000000000000000000173000000000000000000000000000000000000000000000000000000000000017400000000000000000000000000000000000000000000000000000000000001750000000000000000000000000000000000000000000000000000000000000176000000000000000000000000000000000000000000000000000000000000017700000000000000000000000000000000000000000000000000000000000001780000000000000000000000000000000000000000000000000000000000000179000000000000000000000000000000000000000000000000000000000000017a000000000000000000000000000000000000000000000000000000000000017b000000000000000000000000000000000000000000000000000000000000017c000000000000000000000000000000000000000000000000000000000000017d000000000000000000000000000000000000000000000000000000000000017e000000000000000000000000000000000000000000000000000000000000017f0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000018100000000000000000000000000000000000000000000000000000000000001820000000000000000000000000000000000000000000000000000000000000183000000000000000000000000000000000000000000000000000000000000018400000000000000000000000000000000000000000000000000000000000001850000000000000000000000000000000000000000000000000000000000000186000000000000000000000000000000000000000000000000000000000000018700000000000000000000000000000000000000000000000000000000000001880000000000000000000000000000000000000000000000000000000000000189000000000000000000000000000000000000000000000000000000000000018a000000000000000000000000000000000000000000000000000000000000018b000000000000000000000000000000000000000000000000000000000000018c000000000000000000000000000000000000000000000000000000000000018d000000000000000000000000000000000000000000000000000000000000018e000000000000000000000000000000000000000000000000000000000000018f000000000000000000000000000000000000000000000000000000000000019059d5401100000000", - "accounts": [ - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000032", - "0x0000000000000000000000000000000000000000000000000000000000000033", - "0x0000000000000000000000000000000000000000000000000000000000000034", - "0x0000000000000000000000000000000000000000000000000000000000000035", - "0x0000000000000000000000000000000000000000000000000000000000000036", - "0x0000000000000000000000000000000000000000000000000000000000000037", - "0x0000000000000000000000000000000000000000000000000000000000000038", - "0x0000000000000000000000000000000000000000000000000000000000000039", - "0x000000000000000000000000000000000000000000000000000000000000003a", - "0x000000000000000000000000000000000000000000000000000000000000003b", - "0x000000000000000000000000000000000000000000000000000000000000003c", - "0x000000000000000000000000000000000000000000000000000000000000003d", - "0x000000000000000000000000000000000000000000000000000000000000003e", - "0x000000000000000000000000000000000000000000000000000000000000003f", - "0x0000000000000000000000000000000000000000000000000000000000000040", - "0x0000000000000000000000000000000000000000000000000000000000000041", - "0x0000000000000000000000000000000000000000000000000000000000000042", - "0x0000000000000000000000000000000000000000000000000000000000000043", - "0x0000000000000000000000000000000000000000000000000000000000000044", - "0x0000000000000000000000000000000000000000000000000000000000000045", - "0x0000000000000000000000000000000000000000000000000000000000000046", - "0x0000000000000000000000000000000000000000000000000000000000000047", - "0x0000000000000000000000000000000000000000000000000000000000000048", - "0x0000000000000000000000000000000000000000000000000000000000000049", - "0x000000000000000000000000000000000000000000000000000000000000004a", - "0x000000000000000000000000000000000000000000000000000000000000004b", - "0x000000000000000000000000000000000000000000000000000000000000004c", - "0x000000000000000000000000000000000000000000000000000000000000004d", - "0x000000000000000000000000000000000000000000000000000000000000004e", - "0x000000000000000000000000000000000000000000000000000000000000004f", - "0x0000000000000000000000000000000000000000000000000000000000000050", - "0x0000000000000000000000000000000000000000000000000000000000000051", - "0x0000000000000000000000000000000000000000000000000000000000000052", - "0x0000000000000000000000000000000000000000000000000000000000000053", - "0x0000000000000000000000000000000000000000000000000000000000000054", - "0x0000000000000000000000000000000000000000000000000000000000000055", - "0x0000000000000000000000000000000000000000000000000000000000000056", - "0x0000000000000000000000000000000000000000000000000000000000000057", - "0x0000000000000000000000000000000000000000000000000000000000000058", - "0x0000000000000000000000000000000000000000000000000000000000000059", - "0x000000000000000000000000000000000000000000000000000000000000005a", - "0x000000000000000000000000000000000000000000000000000000000000005b", - "0x000000000000000000000000000000000000000000000000000000000000005c", - "0x000000000000000000000000000000000000000000000000000000000000005d", - "0x000000000000000000000000000000000000000000000000000000000000005e", - "0x000000000000000000000000000000000000000000000000000000000000005f", - "0x0000000000000000000000000000000000000000000000000000000000000060", - "0x0000000000000000000000000000000000000000000000000000000000000061", - "0x0000000000000000000000000000000000000000000000000000000000000062", - "0x0000000000000000000000000000000000000000000000000000000000000063", - "0x0000000000000000000000000000000000000000000000000000000000000064", - "0x0000000000000000000000000000000000000000000000000000000000000065", - "0x0000000000000000000000000000000000000000000000000000000000000066", - "0x0000000000000000000000000000000000000000000000000000000000000067", - "0x0000000000000000000000000000000000000000000000000000000000000068", - "0x0000000000000000000000000000000000000000000000000000000000000069", - "0x000000000000000000000000000000000000000000000000000000000000006a", - "0x000000000000000000000000000000000000000000000000000000000000006b", - "0x000000000000000000000000000000000000000000000000000000000000006c", - "0x000000000000000000000000000000000000000000000000000000000000006d", - "0x000000000000000000000000000000000000000000000000000000000000006e", - "0x000000000000000000000000000000000000000000000000000000000000006f", - "0x0000000000000000000000000000000000000000000000000000000000000070", - "0x0000000000000000000000000000000000000000000000000000000000000071", - "0x0000000000000000000000000000000000000000000000000000000000000072", - "0x0000000000000000000000000000000000000000000000000000000000000073", - "0x0000000000000000000000000000000000000000000000000000000000000074", - "0x0000000000000000000000000000000000000000000000000000000000000075", - "0x0000000000000000000000000000000000000000000000000000000000000076", - "0x0000000000000000000000000000000000000000000000000000000000000077", - "0x0000000000000000000000000000000000000000000000000000000000000078", - "0x0000000000000000000000000000000000000000000000000000000000000079", - "0x000000000000000000000000000000000000000000000000000000000000007a", - "0x000000000000000000000000000000000000000000000000000000000000007b", - "0x000000000000000000000000000000000000000000000000000000000000007c", - "0x000000000000000000000000000000000000000000000000000000000000007d", - "0x000000000000000000000000000000000000000000000000000000000000007e", - "0x000000000000000000000000000000000000000000000000000000000000007f", - "0x0000000000000000000000000000000000000000000000000000000000000080", - "0x0000000000000000000000000000000000000000000000000000000000000081", - "0x0000000000000000000000000000000000000000000000000000000000000082", - "0x0000000000000000000000000000000000000000000000000000000000000083", - "0x0000000000000000000000000000000000000000000000000000000000000084", - "0x0000000000000000000000000000000000000000000000000000000000000085", - "0x0000000000000000000000000000000000000000000000000000000000000086", - "0x0000000000000000000000000000000000000000000000000000000000000087", - "0x0000000000000000000000000000000000000000000000000000000000000088", - "0x0000000000000000000000000000000000000000000000000000000000000089", - "0x000000000000000000000000000000000000000000000000000000000000008a", - "0x000000000000000000000000000000000000000000000000000000000000008b", - "0x000000000000000000000000000000000000000000000000000000000000008c", - "0x000000000000000000000000000000000000000000000000000000000000008d", - "0x000000000000000000000000000000000000000000000000000000000000008e", - "0x000000000000000000000000000000000000000000000000000000000000008f", - "0x0000000000000000000000000000000000000000000000000000000000000090", - "0x0000000000000000000000000000000000000000000000000000000000000091", - "0x0000000000000000000000000000000000000000000000000000000000000092", - "0x0000000000000000000000000000000000000000000000000000000000000093", - "0x0000000000000000000000000000000000000000000000000000000000000094", - "0x0000000000000000000000000000000000000000000000000000000000000095", - "0x0000000000000000000000000000000000000000000000000000000000000096", - "0x0000000000000000000000000000000000000000000000000000000000000097", - "0x0000000000000000000000000000000000000000000000000000000000000098", - "0x0000000000000000000000000000000000000000000000000000000000000099", - "0x000000000000000000000000000000000000000000000000000000000000009a", - "0x000000000000000000000000000000000000000000000000000000000000009b", - "0x000000000000000000000000000000000000000000000000000000000000009c", - "0x000000000000000000000000000000000000000000000000000000000000009d", - "0x000000000000000000000000000000000000000000000000000000000000009e", - "0x000000000000000000000000000000000000000000000000000000000000009f", - "0x00000000000000000000000000000000000000000000000000000000000000a0", - "0x00000000000000000000000000000000000000000000000000000000000000a1", - "0x00000000000000000000000000000000000000000000000000000000000000a2", - "0x00000000000000000000000000000000000000000000000000000000000000a3", - "0x00000000000000000000000000000000000000000000000000000000000000a4", - "0x00000000000000000000000000000000000000000000000000000000000000a5", - "0x00000000000000000000000000000000000000000000000000000000000000a6", - "0x00000000000000000000000000000000000000000000000000000000000000a7", - "0x00000000000000000000000000000000000000000000000000000000000000a8", - "0x00000000000000000000000000000000000000000000000000000000000000a9", - "0x00000000000000000000000000000000000000000000000000000000000000aa", - "0x00000000000000000000000000000000000000000000000000000000000000ab", - "0x00000000000000000000000000000000000000000000000000000000000000ac", - "0x00000000000000000000000000000000000000000000000000000000000000ad", - "0x00000000000000000000000000000000000000000000000000000000000000ae", - "0x00000000000000000000000000000000000000000000000000000000000000af", - "0x00000000000000000000000000000000000000000000000000000000000000b0", - "0x00000000000000000000000000000000000000000000000000000000000000b1", - "0x00000000000000000000000000000000000000000000000000000000000000b2", - "0x00000000000000000000000000000000000000000000000000000000000000b3", - "0x00000000000000000000000000000000000000000000000000000000000000b4", - "0x00000000000000000000000000000000000000000000000000000000000000b5", - "0x00000000000000000000000000000000000000000000000000000000000000b6", - "0x00000000000000000000000000000000000000000000000000000000000000b7", - "0x00000000000000000000000000000000000000000000000000000000000000b8", - "0x00000000000000000000000000000000000000000000000000000000000000b9", - "0x00000000000000000000000000000000000000000000000000000000000000ba", - "0x00000000000000000000000000000000000000000000000000000000000000bb", - "0x00000000000000000000000000000000000000000000000000000000000000bc", - "0x00000000000000000000000000000000000000000000000000000000000000bd", - "0x00000000000000000000000000000000000000000000000000000000000000be", - "0x00000000000000000000000000000000000000000000000000000000000000bf", - "0x00000000000000000000000000000000000000000000000000000000000000c0", - "0x00000000000000000000000000000000000000000000000000000000000000c1", - "0x00000000000000000000000000000000000000000000000000000000000000c2", - "0x00000000000000000000000000000000000000000000000000000000000000c3", - "0x00000000000000000000000000000000000000000000000000000000000000c4", - "0x00000000000000000000000000000000000000000000000000000000000000c5", - "0x00000000000000000000000000000000000000000000000000000000000000c6", - "0x00000000000000000000000000000000000000000000000000000000000000c7", - "0x00000000000000000000000000000000000000000000000000000000000000c8", - "0x00000000000000000000000000000000000000000000000000000000000000c9", - "0x00000000000000000000000000000000000000000000000000000000000000ca", - "0x00000000000000000000000000000000000000000000000000000000000000cb", - "0x00000000000000000000000000000000000000000000000000000000000000cc", - "0x00000000000000000000000000000000000000000000000000000000000000cd", - "0x00000000000000000000000000000000000000000000000000000000000000ce", - "0x00000000000000000000000000000000000000000000000000000000000000cf", - "0x00000000000000000000000000000000000000000000000000000000000000d0", - "0x00000000000000000000000000000000000000000000000000000000000000d1", - "0x00000000000000000000000000000000000000000000000000000000000000d2", - "0x00000000000000000000000000000000000000000000000000000000000000d3", - "0x00000000000000000000000000000000000000000000000000000000000000d4", - "0x00000000000000000000000000000000000000000000000000000000000000d5", - "0x00000000000000000000000000000000000000000000000000000000000000d6", - "0x00000000000000000000000000000000000000000000000000000000000000d7", - "0x00000000000000000000000000000000000000000000000000000000000000d8", - "0x00000000000000000000000000000000000000000000000000000000000000d9", - "0x00000000000000000000000000000000000000000000000000000000000000da", - "0x00000000000000000000000000000000000000000000000000000000000000db", - "0x00000000000000000000000000000000000000000000000000000000000000dc", - "0x00000000000000000000000000000000000000000000000000000000000000dd", - "0x00000000000000000000000000000000000000000000000000000000000000de", - "0x00000000000000000000000000000000000000000000000000000000000000df", - "0x00000000000000000000000000000000000000000000000000000000000000e0", - "0x00000000000000000000000000000000000000000000000000000000000000e1", - "0x00000000000000000000000000000000000000000000000000000000000000e2", - "0x00000000000000000000000000000000000000000000000000000000000000e3", - "0x00000000000000000000000000000000000000000000000000000000000000e4", - "0x00000000000000000000000000000000000000000000000000000000000000e5", - "0x00000000000000000000000000000000000000000000000000000000000000e6", - "0x00000000000000000000000000000000000000000000000000000000000000e7", - "0x00000000000000000000000000000000000000000000000000000000000000e8", - "0x00000000000000000000000000000000000000000000000000000000000000e9", - "0x00000000000000000000000000000000000000000000000000000000000000ea", - "0x00000000000000000000000000000000000000000000000000000000000000eb", - "0x00000000000000000000000000000000000000000000000000000000000000ec", - "0x00000000000000000000000000000000000000000000000000000000000000ed", - "0x00000000000000000000000000000000000000000000000000000000000000ee", - "0x00000000000000000000000000000000000000000000000000000000000000ef", - "0x00000000000000000000000000000000000000000000000000000000000000f0", - "0x00000000000000000000000000000000000000000000000000000000000000f1", - "0x00000000000000000000000000000000000000000000000000000000000000f2", - "0x00000000000000000000000000000000000000000000000000000000000000f3", - "0x00000000000000000000000000000000000000000000000000000000000000f4", - "0x00000000000000000000000000000000000000000000000000000000000000f5", - "0x00000000000000000000000000000000000000000000000000000000000000f6", - "0x00000000000000000000000000000000000000000000000000000000000000f7", - "0x00000000000000000000000000000000000000000000000000000000000000f8", - "0x00000000000000000000000000000000000000000000000000000000000000f9", - "0x00000000000000000000000000000000000000000000000000000000000000fa", - "0x00000000000000000000000000000000000000000000000000000000000000fb", - "0x00000000000000000000000000000000000000000000000000000000000000fc", - "0x00000000000000000000000000000000000000000000000000000000000000fd", - "0x00000000000000000000000000000000000000000000000000000000000000fe", - "0x00000000000000000000000000000000000000000000000000000000000000ff", - "0x0000000000000000000000000000000000000000000000000000000000000100", - "0x0000000000000000000000000000000000000000000000000000000000000101", - "0x0000000000000000000000000000000000000000000000000000000000000102", - "0x0000000000000000000000000000000000000000000000000000000000000103", - "0x0000000000000000000000000000000000000000000000000000000000000104", - "0x0000000000000000000000000000000000000000000000000000000000000105", - "0x0000000000000000000000000000000000000000000000000000000000000106", - "0x0000000000000000000000000000000000000000000000000000000000000107", - "0x0000000000000000000000000000000000000000000000000000000000000108", - "0x0000000000000000000000000000000000000000000000000000000000000109", - "0x000000000000000000000000000000000000000000000000000000000000010a", - "0x000000000000000000000000000000000000000000000000000000000000010b", - "0x000000000000000000000000000000000000000000000000000000000000010c", - "0x000000000000000000000000000000000000000000000000000000000000010d", - "0x000000000000000000000000000000000000000000000000000000000000010e", - "0x000000000000000000000000000000000000000000000000000000000000010f", - "0x0000000000000000000000000000000000000000000000000000000000000110", - "0x0000000000000000000000000000000000000000000000000000000000000111", - "0x0000000000000000000000000000000000000000000000000000000000000112", - "0x0000000000000000000000000000000000000000000000000000000000000113", - "0x0000000000000000000000000000000000000000000000000000000000000114", - "0x0000000000000000000000000000000000000000000000000000000000000115", - "0x0000000000000000000000000000000000000000000000000000000000000116", - "0x0000000000000000000000000000000000000000000000000000000000000117", - "0x0000000000000000000000000000000000000000000000000000000000000118", - "0x0000000000000000000000000000000000000000000000000000000000000119", - "0x000000000000000000000000000000000000000000000000000000000000011a", - "0x000000000000000000000000000000000000000000000000000000000000011b", - "0x000000000000000000000000000000000000000000000000000000000000011c", - "0x000000000000000000000000000000000000000000000000000000000000011d", - "0x000000000000000000000000000000000000000000000000000000000000011e", - "0x000000000000000000000000000000000000000000000000000000000000011f", - "0x0000000000000000000000000000000000000000000000000000000000000120", - "0x0000000000000000000000000000000000000000000000000000000000000121", - "0x0000000000000000000000000000000000000000000000000000000000000122", - "0x0000000000000000000000000000000000000000000000000000000000000123", - "0x0000000000000000000000000000000000000000000000000000000000000124", - "0x0000000000000000000000000000000000000000000000000000000000000125", - "0x0000000000000000000000000000000000000000000000000000000000000126", - "0x0000000000000000000000000000000000000000000000000000000000000127", - "0x0000000000000000000000000000000000000000000000000000000000000128", - "0x0000000000000000000000000000000000000000000000000000000000000129", - "0x000000000000000000000000000000000000000000000000000000000000012a", - "0x000000000000000000000000000000000000000000000000000000000000012b", - "0x000000000000000000000000000000000000000000000000000000000000012c", - "0x000000000000000000000000000000000000000000000000000000000000012d", - "0x000000000000000000000000000000000000000000000000000000000000012e", - "0x000000000000000000000000000000000000000000000000000000000000012f", - "0x0000000000000000000000000000000000000000000000000000000000000130", - "0x0000000000000000000000000000000000000000000000000000000000000131", - "0x0000000000000000000000000000000000000000000000000000000000000132", - "0x0000000000000000000000000000000000000000000000000000000000000133", - "0x0000000000000000000000000000000000000000000000000000000000000134", - "0x0000000000000000000000000000000000000000000000000000000000000135", - "0x0000000000000000000000000000000000000000000000000000000000000136", - "0x0000000000000000000000000000000000000000000000000000000000000137", - "0x0000000000000000000000000000000000000000000000000000000000000138", - "0x0000000000000000000000000000000000000000000000000000000000000139", - "0x000000000000000000000000000000000000000000000000000000000000013a", - "0x000000000000000000000000000000000000000000000000000000000000013b", - "0x000000000000000000000000000000000000000000000000000000000000013c", - "0x000000000000000000000000000000000000000000000000000000000000013d", - "0x000000000000000000000000000000000000000000000000000000000000013e", - "0x000000000000000000000000000000000000000000000000000000000000013f", - "0x0000000000000000000000000000000000000000000000000000000000000140", - "0x0000000000000000000000000000000000000000000000000000000000000141", - "0x0000000000000000000000000000000000000000000000000000000000000142", - "0x0000000000000000000000000000000000000000000000000000000000000143", - "0x0000000000000000000000000000000000000000000000000000000000000144", - "0x0000000000000000000000000000000000000000000000000000000000000145", - "0x0000000000000000000000000000000000000000000000000000000000000146", - "0x0000000000000000000000000000000000000000000000000000000000000147", - "0x0000000000000000000000000000000000000000000000000000000000000148", - "0x0000000000000000000000000000000000000000000000000000000000000149", - "0x000000000000000000000000000000000000000000000000000000000000014a", - "0x000000000000000000000000000000000000000000000000000000000000014b", - "0x000000000000000000000000000000000000000000000000000000000000014c", - "0x000000000000000000000000000000000000000000000000000000000000014d", - "0x000000000000000000000000000000000000000000000000000000000000014e", - "0x000000000000000000000000000000000000000000000000000000000000014f", - "0x0000000000000000000000000000000000000000000000000000000000000150", - "0x0000000000000000000000000000000000000000000000000000000000000151", - "0x0000000000000000000000000000000000000000000000000000000000000152", - "0x0000000000000000000000000000000000000000000000000000000000000153", - "0x0000000000000000000000000000000000000000000000000000000000000154", - "0x0000000000000000000000000000000000000000000000000000000000000155", - "0x0000000000000000000000000000000000000000000000000000000000000156", - "0x0000000000000000000000000000000000000000000000000000000000000157", - "0x0000000000000000000000000000000000000000000000000000000000000158", - "0x0000000000000000000000000000000000000000000000000000000000000159", - "0x000000000000000000000000000000000000000000000000000000000000015a", - "0x000000000000000000000000000000000000000000000000000000000000015b", - "0x000000000000000000000000000000000000000000000000000000000000015c", - "0x000000000000000000000000000000000000000000000000000000000000015d", - "0x000000000000000000000000000000000000000000000000000000000000015e", - "0x000000000000000000000000000000000000000000000000000000000000015f", - "0x0000000000000000000000000000000000000000000000000000000000000160", - "0x0000000000000000000000000000000000000000000000000000000000000161", - "0x0000000000000000000000000000000000000000000000000000000000000162", - "0x0000000000000000000000000000000000000000000000000000000000000163", - "0x0000000000000000000000000000000000000000000000000000000000000164", - "0x0000000000000000000000000000000000000000000000000000000000000165", - "0x0000000000000000000000000000000000000000000000000000000000000166", - "0x0000000000000000000000000000000000000000000000000000000000000167", - "0x0000000000000000000000000000000000000000000000000000000000000168", - "0x0000000000000000000000000000000000000000000000000000000000000169", - "0x000000000000000000000000000000000000000000000000000000000000016a", - "0x000000000000000000000000000000000000000000000000000000000000016b", - "0x000000000000000000000000000000000000000000000000000000000000016c", - "0x000000000000000000000000000000000000000000000000000000000000016d", - "0x000000000000000000000000000000000000000000000000000000000000016e", - "0x000000000000000000000000000000000000000000000000000000000000016f", - "0x0000000000000000000000000000000000000000000000000000000000000170", - "0x0000000000000000000000000000000000000000000000000000000000000171", - "0x0000000000000000000000000000000000000000000000000000000000000172", - "0x0000000000000000000000000000000000000000000000000000000000000173", - "0x0000000000000000000000000000000000000000000000000000000000000174", - "0x0000000000000000000000000000000000000000000000000000000000000175", - "0x0000000000000000000000000000000000000000000000000000000000000176", - "0x0000000000000000000000000000000000000000000000000000000000000177", - "0x0000000000000000000000000000000000000000000000000000000000000178", - "0x0000000000000000000000000000000000000000000000000000000000000179", - "0x000000000000000000000000000000000000000000000000000000000000017a", - "0x000000000000000000000000000000000000000000000000000000000000017b", - "0x000000000000000000000000000000000000000000000000000000000000017c", - "0x000000000000000000000000000000000000000000000000000000000000017d", - "0x000000000000000000000000000000000000000000000000000000000000017e", - "0x000000000000000000000000000000000000000000000000000000000000017f", - "0x0000000000000000000000000000000000000000000000000000000000000180", - "0x0000000000000000000000000000000000000000000000000000000000000181", - "0x0000000000000000000000000000000000000000000000000000000000000182", - "0x0000000000000000000000000000000000000000000000000000000000000183", - "0x0000000000000000000000000000000000000000000000000000000000000184", - "0x0000000000000000000000000000000000000000000000000000000000000185", - "0x0000000000000000000000000000000000000000000000000000000000000186", - "0x0000000000000000000000000000000000000000000000000000000000000187", - "0x0000000000000000000000000000000000000000000000000000000000000188", - "0x0000000000000000000000000000000000000000000000000000000000000189", - "0x000000000000000000000000000000000000000000000000000000000000018a", - "0x000000000000000000000000000000000000000000000000000000000000018b", - "0x000000000000000000000000000000000000000000000000000000000000018c", - "0x000000000000000000000000000000000000000000000000000000000000018d", - "0x000000000000000000000000000000000000000000000000000000000000018e", - "0x000000000000000000000000000000000000000000000000000000000000018f", - "0x0000000000000000000000000000000000000000000000000000000000000190" - ], - "epoch": 289461593 -} diff --git a/overridden_contracts/test/snowbridge-data/test_vector_message_validator_50.json b/overridden_contracts/test/snowbridge-data/test_vector_message_validator_50.json deleted file mode 100644 index 121a1af..0000000 --- a/overridden_contracts/test/snowbridge-data/test_vector_message_validator_50.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "payload": "0x701500380000c8000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000032f055885f94010000", - "accounts": [ - "0x0000000000000000000000000000000000000000000000000000000000000001", - "0x0000000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000003", - "0x0000000000000000000000000000000000000000000000000000000000000004", - "0x0000000000000000000000000000000000000000000000000000000000000005", - "0x0000000000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000007", - "0x0000000000000000000000000000000000000000000000000000000000000008", - "0x0000000000000000000000000000000000000000000000000000000000000009", - "0x000000000000000000000000000000000000000000000000000000000000000a", - "0x000000000000000000000000000000000000000000000000000000000000000b", - "0x000000000000000000000000000000000000000000000000000000000000000c", - "0x000000000000000000000000000000000000000000000000000000000000000d", - "0x000000000000000000000000000000000000000000000000000000000000000e", - "0x000000000000000000000000000000000000000000000000000000000000000f", - "0x0000000000000000000000000000000000000000000000000000000000000010", - "0x0000000000000000000000000000000000000000000000000000000000000011", - "0x0000000000000000000000000000000000000000000000000000000000000012", - "0x0000000000000000000000000000000000000000000000000000000000000013", - "0x0000000000000000000000000000000000000000000000000000000000000014", - "0x0000000000000000000000000000000000000000000000000000000000000015", - "0x0000000000000000000000000000000000000000000000000000000000000016", - "0x0000000000000000000000000000000000000000000000000000000000000017", - "0x0000000000000000000000000000000000000000000000000000000000000018", - "0x0000000000000000000000000000000000000000000000000000000000000019", - "0x000000000000000000000000000000000000000000000000000000000000001a", - "0x000000000000000000000000000000000000000000000000000000000000001b", - "0x000000000000000000000000000000000000000000000000000000000000001c", - "0x000000000000000000000000000000000000000000000000000000000000001d", - "0x000000000000000000000000000000000000000000000000000000000000001e", - "0x000000000000000000000000000000000000000000000000000000000000001f", - "0x0000000000000000000000000000000000000000000000000000000000000020", - "0x0000000000000000000000000000000000000000000000000000000000000021", - "0x0000000000000000000000000000000000000000000000000000000000000022", - "0x0000000000000000000000000000000000000000000000000000000000000023", - "0x0000000000000000000000000000000000000000000000000000000000000024", - "0x0000000000000000000000000000000000000000000000000000000000000025", - "0x0000000000000000000000000000000000000000000000000000000000000026", - "0x0000000000000000000000000000000000000000000000000000000000000027", - "0x0000000000000000000000000000000000000000000000000000000000000028", - "0x0000000000000000000000000000000000000000000000000000000000000029", - "0x000000000000000000000000000000000000000000000000000000000000002a", - "0x000000000000000000000000000000000000000000000000000000000000002b", - "0x000000000000000000000000000000000000000000000000000000000000002c", - "0x000000000000000000000000000000000000000000000000000000000000002d", - "0x000000000000000000000000000000000000000000000000000000000000002e", - "0x000000000000000000000000000000000000000000000000000000000000002f", - "0x0000000000000000000000000000000000000000000000000000000000000030", - "0x0000000000000000000000000000000000000000000000000000000000000031", - "0x0000000000000000000000000000000000000000000000000000000000000032" - ], - "epoch": 1736769558000 - }