From 25ba9e0bc35ac249132208813da344a511b98160 Mon Sep 17 00:00:00 2001 From: cloud8little <34291844+cloud8little@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:25:56 +0800 Subject: [PATCH] Add Upgrade ExoCapsule and WithdrawalValidator Script (#108) * Add Upgrade ExoCapsule and WithdrawalValidator Script * update * update * change script name * fix format * fix format * refactor --- script/13_DepositValidator.s.sol | 32 ++-- script/16_UpgradeExoCapsule.s.sol | 34 ++++ script/17_WithdrawalValidator.s.sol | 156 +++++++++++++++++ script/3_Setup.s.sol | 24 +-- script/validatorProof_staker1_testnetV6.json | 68 ++++++++ ...walProof_fullwithdraw_2495260_2472449.json | 160 ++++++++++++++++++ 6 files changed, 444 insertions(+), 30 deletions(-) create mode 100644 script/16_UpgradeExoCapsule.s.sol create mode 100644 script/17_WithdrawalValidator.s.sol create mode 100644 script/validatorProof_staker1_testnetV6.json create mode 100644 script/withdrawalProof_fullwithdraw_2495260_2472449.json diff --git a/script/13_DepositValidator.s.sol b/script/13_DepositValidator.s.sol index 580d53e4..c5bceac0 100644 --- a/script/13_DepositValidator.s.sol +++ b/script/13_DepositValidator.s.sol @@ -33,7 +33,7 @@ contract DepositScript is BaseScript { function setUp() public virtual override { super.setUp(); - + string memory validatorInfo = vm.readFile("script/validatorProof_staker1_testnetV6.json"); string memory deployedContracts = vm.readFile("script/deployedContracts.json"); clientGateway = @@ -44,12 +44,8 @@ contract DepositScript is BaseScript { require(address(beaconOracle) != address(0), "beacon oracle address should not be empty"); // load beacon chain validator container and proof from json file - _loadValidatorContainer(); - _loadValidatorProof(); - - if (!useExocorePrecompileMock) { - _bindPrecompileMocks(); - } + _loadValidatorContainer(validatorInfo); + _loadValidatorProof(validatorInfo); // transfer some gas fee to depositor, relayer and exocore gateway clientChain = vm.createSelectFork(clientChainRPCURL); @@ -57,6 +53,10 @@ contract DepositScript is BaseScript { exocore = vm.createSelectFork(exocoreRPCURL); _topUpPlayer(exocore, address(0), exocoreGenesis, address(exocoreGateway), 1 ether); + + if (!useExocorePrecompileMock) { + _bindPrecompileMocks(); + } } function run() public { @@ -88,26 +88,20 @@ contract DepositScript is BaseScript { vm.stopBroadcast(); } - function _loadValidatorContainer() internal { - string memory validatorInfo = vm.readFile("script/validator_container_proof_1711400.json"); - - validatorContainer = stdJson.readBytes32Array(validatorInfo, ".ValidatorFields"); + function _loadValidatorContainer(string memory validatorInfo) internal { + validatorContainer = stdJson.readBytes32Array(validatorInfo, ".validatorContainer"); require(validatorContainer.length > 0, "validator container should not be empty"); } - function _loadValidatorProof() internal { - string memory validatorInfo = vm.readFile("script/validator_container_proof_1711400.json"); - + function _loadValidatorProof(string memory validatorInfo) internal { uint256 slot = stdJson.readUint(validatorInfo, ".slot"); validatorProof.beaconBlockTimestamp = GENESIS_BLOCK_TIMESTAMP + SECONDS_PER_SLOT * slot; - validatorProof.stateRoot = stdJson.readBytes32(validatorInfo, ".beaconStateRoot"); + validatorProof.stateRoot = stdJson.readBytes32(validatorInfo, ".stateRoot"); require(validatorProof.stateRoot != bytes32(0), "state root should not be empty"); - validatorProof.stateRootProof = - stdJson.readBytes32Array(validatorInfo, ".StateRootAgainstLatestBlockHeaderProof"); + validatorProof.stateRootProof = stdJson.readBytes32Array(validatorInfo, ".stateRootProof"); require(validatorProof.stateRootProof.length == 3, "state root proof should have 3 nodes"); - validatorProof.validatorContainerRootProof = - stdJson.readBytes32Array(validatorInfo, ".WithdrawalCredentialProof"); + validatorProof.validatorContainerRootProof = stdJson.readBytes32Array(validatorInfo, ".validatorContainerProof"); require(validatorProof.validatorContainerRootProof.length == 46, "validator root proof should have 46 nodes"); validatorProof.validatorIndex = stdJson.readUint(validatorInfo, ".validatorIndex"); require(validatorProof.validatorIndex != 0, "validator root index should not be 0"); diff --git a/script/16_UpgradeExoCapsule.s.sol b/script/16_UpgradeExoCapsule.s.sol new file mode 100644 index 00000000..349ef424 --- /dev/null +++ b/script/16_UpgradeExoCapsule.s.sol @@ -0,0 +1,34 @@ +pragma solidity ^0.8.19; + +import "../src/core/ExoCapsule.sol"; +import "./BaseScript.sol"; +import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import "forge-std/Script.sol"; + +contract UpgradeExoCapsuleScript is BaseScript { + + UpgradeableBeacon capsuleBeaconContract; + + function setUp() public virtual override { + super.setUp(); + + string memory deployedContracts = vm.readFile("script/deployedContracts.json"); + + capsuleBeaconContract = + UpgradeableBeacon((stdJson.readAddress(deployedContracts, ".clientChain.capsuleBeacon"))); + require(address(capsuleBeaconContract) != address(0), "capsuleBeacon address should not be empty"); + clientChain = vm.createSelectFork(clientChainRPCURL); + } + + function run() public { + vm.selectFork(clientChain); + vm.startBroadcast(deployer.privateKey); + console.log("owner", capsuleBeaconContract.owner()); + ExoCapsule capsule = new ExoCapsule(); + capsuleBeaconContract.upgradeTo(address(capsule)); + vm.stopBroadcast(); + + console.log("new Exocapsule Implementation address: ", address(capsule)); + } + +} diff --git a/script/17_WithdrawalValidator.s.sol b/script/17_WithdrawalValidator.s.sol new file mode 100644 index 00000000..607ae531 --- /dev/null +++ b/script/17_WithdrawalValidator.s.sol @@ -0,0 +1,156 @@ +pragma solidity ^0.8.19; + +import "../src/core/ExoCapsule.sol"; +import "../src/interfaces/IClientChainGateway.sol"; + +import "../src/interfaces/IExoCapsule.sol"; +import "../src/interfaces/IExocoreGateway.sol"; +import "../src/interfaces/IVault.sol"; + +import "../src/storage/GatewayStorage.sol"; +import "@beacon-oracle/contracts/src/EigenLayerBeaconOracle.sol"; +import "@layerzero-v2/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol"; +import "@layerzero-v2/protocol/contracts/libs/AddressCast.sol"; +import "@layerzerolabs/lz-evm-protocol-v2/contracts/libs/GUID.sol"; +import {ERC20PresetFixedSupply} from "@openzeppelin/contracts/token/ERC20/presets/ERC20PresetFixedSupply.sol"; +import "forge-std/Script.sol"; + +import "src/libraries/Endian.sol"; + +import {BaseScript} from "./BaseScript.sol"; + +import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import "forge-std/StdJson.sol"; +import "src/libraries/BeaconChainProofs.sol"; + +contract WithdrawalValidatorScript is BaseScript { + + using AddressCast for address; + using Endian for bytes32; + + bytes32[] validatorContainer; + BeaconChainProofs.ValidatorContainerProof validatorProof; + bytes32[] withdrawalContainer; + BeaconChainProofs.WithdrawalProof withdrawalProof; + + uint256 internal constant GENESIS_BLOCK_TIMESTAMP = 1_695_902_400; + uint256 internal constant SECONDS_PER_SLOT = 12; + uint256 constant GWEI_TO_WEI = 1e9; + + function setUp() public virtual override { + super.setUp(); + + string memory deployedContracts = vm.readFile("script/deployedContracts.json"); + + clientGateway = + IClientChainGateway(payable(stdJson.readAddress(deployedContracts, ".clientChain.clientChainGateway"))); + require(address(clientGateway) != address(0), "clientGateway address should not be empty"); + + beaconOracle = EigenLayerBeaconOracle(stdJson.readAddress(deployedContracts, ".clientChain.beaconOracle")); + require(address(beaconOracle) != address(0), "beacon oracle address should not be empty"); + + // load beacon chain validator container and proof from json file + _loadValidatorContainer(); + _loadValidatorProof(); + + _loadWithdrawalContainer(); + _loadWithdrawalProof(); + + if (!useExocorePrecompileMock) { + _bindPrecompileMocks(); + } + + // transfer some gas fee to depositor, relayer and exocore gateway + clientChain = vm.createSelectFork(clientChainRPCURL); + _topUpPlayer(clientChain, address(0), deployer, depositor.addr, 0.2 ether); + + exocore = vm.createSelectFork(exocoreRPCURL); + _topUpPlayer(exocore, address(0), exocoreGenesis, address(exocoreGateway), 1 ether); + } + + function run() public { + bytes memory root = abi.encodePacked(hex"c0fa1dc87438211f4f73fab438558794947572b771f68c905eee959dba104877"); + vm.mockCall( + address(beaconOracle), abi.encodeWithSelector(beaconOracle.timestampToBlockRoot.selector), abi.encode(root) + ); + vm.selectFork(clientChain); + + console.log("block.timestamp", validatorProof.beaconBlockTimestamp); + vm.startBroadcast(depositor.privateKey); + (bool success,) = address(beaconOracle).call( + abi.encodeWithSelector(beaconOracle.addTimestamp.selector, validatorProof.beaconBlockTimestamp) + ); + vm.stopBroadcast(); + + vm.startBroadcast(depositor.privateKey); + bytes memory dummyInput = new bytes(97); + uint256 nativeFee = clientGateway.quote(dummyInput); + clientGateway.processBeaconChainWithdrawal{value: nativeFee}( + validatorContainer, validatorProof, withdrawalContainer, withdrawalProof + ); + + vm.stopBroadcast(); + } + + function _loadValidatorContainer() internal { + string memory validatorInfo = vm.readFile("script/withdrawalProof_fullwithdraw_2495260_2472449.json"); + + validatorContainer = stdJson.readBytes32Array(validatorInfo, ".validatorContainer"); + require(validatorContainer.length > 0, "validator container should not be empty"); + } + + function _loadValidatorProof() internal { + string memory validatorInfo = vm.readFile("script/withdrawalProof_fullwithdraw_2495260_2472449.json"); + + uint256 slot = stdJson.readUint(validatorInfo, ".slot"); + validatorProof.beaconBlockTimestamp = GENESIS_BLOCK_TIMESTAMP + SECONDS_PER_SLOT * slot; + + validatorProof.stateRoot = stdJson.readBytes32(validatorInfo, ".stateRoot"); + require(validatorProof.stateRoot != bytes32(0), "state root should not be empty"); + validatorProof.stateRootProof = stdJson.readBytes32Array(validatorInfo, ".stateRootProof"); + require(validatorProof.stateRootProof.length == 3, "state root proof should have 3 nodes"); + validatorProof.validatorContainerRootProof = stdJson.readBytes32Array(validatorInfo, ".validatorContainerProof"); + require(validatorProof.validatorContainerRootProof.length == 46, "validator root proof should have 46 nodes"); + validatorProof.validatorIndex = stdJson.readUint(validatorInfo, ".validatorIndex"); + require(validatorProof.validatorIndex != 0, "validator root index should not be 0"); + } + + function _loadWithdrawalContainer() internal { + string memory withdrawalInfo = vm.readFile("script/withdrawalProof_fullwithdraw_2495260_2472449.json"); + + withdrawalContainer = stdJson.readBytes32Array(withdrawalInfo, ".withdrawalContainer"); + require(withdrawalContainer.length > 0, "withdrawal container should not be empty"); + } + + function _loadWithdrawalProof() internal { + string memory withdrawalInfo = vm.readFile("script/withdrawalProof_fullwithdraw_2495260_2472449.json"); + + withdrawalProof.withdrawalContainerRootProof = + stdJson.readBytes32Array(withdrawalInfo, ".withdrawalContainerProof"); + + console.log("withdrawalContainerProof"); + console.logBytes32(withdrawalProof.withdrawalContainerRootProof[0]); + withdrawalProof.slotProof = stdJson.readBytes32Array(withdrawalInfo, ".slotRootProof"); + withdrawalProof.executionPayloadRootProof = + stdJson.readBytes32Array(withdrawalInfo, ".executionPayloadRootProof"); + withdrawalProof.timestampProof = stdJson.readBytes32Array(withdrawalInfo, ".timestampRootProof"); + withdrawalProof.historicalSummaryBlockRootProof = + stdJson.readBytes32Array(withdrawalInfo, ".historicalSummaryBlockRootProof"); + withdrawalProof.blockRootIndex = stdJson.readUint(withdrawalInfo, ".blockRootIndex"); + require(withdrawalProof.blockRootIndex != 0, "block root index should not be 0"); + withdrawalProof.historicalSummaryIndex = stdJson.readUint(withdrawalInfo, ".historicalSummaryIndex"); + withdrawalProof.withdrawalIndex = stdJson.readUint(withdrawalInfo, ".withdrawalIndexWithinBlock"); + withdrawalProof.blockRoot = stdJson.readBytes32(withdrawalInfo, ".historicalSummaryBlockRoot"); + require(withdrawalProof.blockRoot != bytes32(0), "block root should not be empty"); + withdrawalProof.slotRoot = stdJson.readBytes32(withdrawalInfo, ".slotRoot"); + withdrawalProof.timestampRoot = stdJson.readBytes32(withdrawalInfo, ".timestampRoot"); + withdrawalProof.executionPayloadRoot = stdJson.readBytes32(withdrawalInfo, ".executionPayloadRoot"); + withdrawalProof.stateRoot = stdJson.readBytes32(withdrawalInfo, ".stateRoot"); + // console.logBytes32("load withdrawal proof stateRoot", withdrawalProof.stateRoot); + } + + function _getEffectiveBalance(bytes32[] storage vc) internal view returns (uint64) { + return vc[2].fromLittleEndianUint64(); + } + +} diff --git a/script/3_Setup.s.sol b/script/3_Setup.s.sol index 8e2c5f72..84ca88e7 100644 --- a/script/3_Setup.s.sol +++ b/script/3_Setup.s.sol @@ -33,25 +33,22 @@ contract SetupScript is BaseScript { restakeToken = ERC20PresetFixedSupply(stdJson.readAddress(deployedContracts, ".clientChain.erc20Token")); require(address(restakeToken) != address(0), "restakeToken address should not be empty"); - vault = IVault(stdJson.readAddress(deployedContracts, ".clientChain.resVault")); - require(address(vault) != address(0), "vault address should not be empty"); - exocoreGateway = IExocoreGateway(payable(stdJson.readAddress(deployedContracts, ".exocore.exocoreGateway"))); require(address(exocoreGateway) != address(0), "exocoreGateway address should not be empty"); exocoreLzEndpoint = ILayerZeroEndpointV2(stdJson.readAddress(deployedContracts, ".exocore.lzEndpoint")); require(address(exocoreLzEndpoint) != address(0), "exocoreLzEndpoint address should not be empty"); - if (!useExocorePrecompileMock) { - _bindPrecompileMocks(); - } - // transfer some gas fee to contract owner clientChain = vm.createSelectFork(clientChainRPCURL); _topUpPlayer(clientChain, address(0), deployer, exocoreValidatorSet.addr, 0.2 ether); exocore = vm.createSelectFork(exocoreRPCURL); _topUpPlayer(exocore, address(0), exocoreGenesis, exocoreValidatorSet.addr, 0.2 ether); + + if (!useExocorePrecompileMock) { + _bindPrecompileMocks(); + } } function run() public { @@ -88,9 +85,10 @@ contract SetupScript is BaseScript { exocoreGateway.registerOrUpdateClientChain( clientChainId, address(clientGateway).toBytes32(), 20, "ClientChain", "EVM compatible network", "secp256k1" ); + vm.stopBroadcast(); // 3. adding tokens to the whtielist of both Exocore and client chain gateway to enable restaking - + vm.selectFork(clientChain); // first we read decimals from client chain ERC20 token contract to prepare for token data bytes32[] memory whitelistTokensBytes32 = new bytes32[](2); uint8[] memory decimals = new uint8[](2); @@ -104,7 +102,7 @@ contract SetupScript is BaseScript { decimals[0] = restakeToken.decimals(); names[0] = "RestakeToken"; metaDatas[0] = "ERC20 LST token"; - oracleInfos[0] = "{'a': 'b'}"; + oracleInfos[0] = "ETH,Ethereum,8"; tvlLimits[0] = uint128(restakeToken.totalSupply() / 5); // in phases of 20% // this stands for Native Restaking for ETH @@ -112,16 +110,20 @@ contract SetupScript is BaseScript { decimals[1] = 18; names[1] = "StakedETH"; metaDatas[1] = "natively staked ETH on Ethereum"; - oracleInfos[1] = "{'b': 'a'}"; + oracleInfos[1] = "ETH,Ethereum,8"; //[tokenName],[chainName],[tokenDecimal](,[interval],[contract](,[ChainDesc:{...}],[TokenDesc:{...}])) tvlLimits[1] = 0; // irrelevant for native restaking // second add whitelist tokens and their meta data on Exocore side to enable LST Restaking and Native Restaking, // and this would also add token addresses to client chain gateway's whitelist + vm.selectFork(exocore); + vm.startBroadcast(exocoreValidatorSet.privateKey); uint256 nativeFee; for (uint256 i = 0; i < whitelistTokensBytes32.length; i++) { nativeFee = exocoreGateway.quote( clientChainId, - abi.encodePacked(Action.REQUEST_ADD_WHITELIST_TOKEN, abi.encodePacked(whitelistTokensBytes32[i])) + abi.encodePacked( + Action.REQUEST_ADD_WHITELIST_TOKEN, abi.encodePacked(whitelistTokensBytes32[i], tvlLimits[i]) + ) ); exocoreGateway.addWhitelistToken{value: nativeFee}( clientChainId, diff --git a/script/validatorProof_staker1_testnetV6.json b/script/validatorProof_staker1_testnetV6.json new file mode 100644 index 00000000..fc1e6570 --- /dev/null +++ b/script/validatorProof_staker1_testnetV6.json @@ -0,0 +1,68 @@ +{ + "slot": 2720312, + "validatorIndex": 1819867, + "stateRoot": "0xd23d2167739b9ce63139d87d60c0a3e47778bfd33eb78f2e5b2f824a87de284b", + "stateRootProof": [ + "0xeb5cea3bc3bfa00d3fd8211e396d9fd5fca13a275b4e05d260709d49a9a7e6d5", + "0x6245ea08950aad0dde501c031d16997d1e89e4603e3d4a19c3b37526011de0cf", + "0x98f59e15e3bd559f928f2352bd3cc8d6c17ae1ef0d6d376a1de0987fd0ea17ed" + ], + "validatorContainer": [ + "0x24a871b6c5c01f37dfaf7a30bc8194ec3305f78022aaccb80743db150d1f2de1", + "0x010000000000000000000000f6df11416f870ed14353c53dcad40ae01a78e875", + "0x0040597307000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xe74b010000000000000000000000000000000000000000000000000000000000", + "0xed4b010000000000000000000000000000000000000000000000000000000000", + "0xffffffffffffffff000000000000000000000000000000000000000000000000", + "0xffffffffffffffff000000000000000000000000000000000000000000000000" + ], + "validatorContainerProof": [ + "0x99dba25d4884f7a8dda327fc6551d078c2cbacef7e0371e49f60ee1aab1924cb", + "0x48592ea6e6bba67718164ceb162a941441be530fe1240ed08f398ff4d61522af", + "0x94a4e7de0a842dc3beb367d62d394a012afd462af988ac2c19697ca530d73ffe", + "0x5eda3c016614e3d0b9f5b09c0d8e6bc1d6084da2bda0cd1c532d27cefbba5cab", + "0xd447a4f77d660a7a5c0222a577b61adae203b6705016c9cd7b174fe2013cebb7", + "0x0433670bf77202ea835f6c0369a2dfe529853808cc73aefd36e4d4f8840b484c", + "0xbed181dd01444228505e043fff6279c83d3dc7e057a068b182f8029104763a62", + "0xc4c4c02eed6273ff658e672d671bd9dee993a990229da4caad7f43ea83a981c5", + "0xb2b2d661d89fbe40f5099a27065acaf1b11cd092fe9349a5a3ade222b4afcce5", + "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x66c3b82b785bc755cc54fb2e9f2ba024b9aa724dabe9f88c19760b10bec2e5d9", + "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x820f39b715fdf3e5efe8d08b67ddd6af8b516439beefa51905fb7e3c39949cda", + "0xe3ba2e312a445c5cf666804b29f979992109f11688b2bc9e527e87ac62cb5df8", + "0xe8a886addaeff05ce9f71e5e7753b368597b14eac84cf27d3e6ee238e511c368", + "0x4ccbe8988177d82682fa008c567c97efa58d63fd42bf1c984ab9f28f2e7e9341", + "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0xf62f086caf09c65f1f326b780361a0ee4572defedca572adb00977827f872df6", + "0x16cf8325d06b477ad53348b29d22fc0ec7dfca1aa5751569c8450d21ade40c21", + "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7", + "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff", + "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5", + "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d", + "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c", + "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327", + "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74", + "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76", + "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f", + "0x44c51b0000000000000000000000000000000000000000000000000000000000", + "0x04df050000000000000000000000000000000000000000000000000000000000", + "0x8446dcc6f0e908bb31d3b47ef0ab8198f87d2a7386718a087346dbb06ad7eb70", + "0x4382f67ee646f56303e3195b5af1af4bc105bf316bcc48c05cf34a033c7863b6", + "0xf085ae5e7b501886a9ba9e01210e0f7ff08d717b330297dfbb5b2108d2b5ee7c", + "0xed87fe31599a69b3cdb14b7d722e97caf17bc1f6af2e6801a372927f0158bffd" + ] +} \ No newline at end of file diff --git a/script/withdrawalProof_fullwithdraw_2495260_2472449.json b/script/withdrawalProof_fullwithdraw_2495260_2472449.json new file mode 100644 index 00000000..852bcd3b --- /dev/null +++ b/script/withdrawalProof_fullwithdraw_2495260_2472449.json @@ -0,0 +1,160 @@ +{ + "validatorIndex": 1795536, + "slot": 2495260, + "stateRoot": "0x6c79609e1863995707c8a92b94cd3e7212922489b2e34684af20638ad655a7c5", + "stateRootProof": [ + "0x8f07e00e40b034c80ce1dabe007e70f0f07115c36acd41906cca30195815b62c", + "0x20f1ba1dc90ada4795b034b3508986bc27e5610f21a118edccecc21adc427acb", + "0xd73ed0e776120b0aa73605e58a1886eee67a8ebe437bec84552c57e07dd30b3d" + ], + "validatorContainer": [ + "0x3a4c7fc0f2413a3836bf07664a0a26f2ad42a28c27f8ffbee6d277584aa0892b", + "0x01000000000000000000000087bc52e992a299744f238fb7225bb3641a778507", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x6616010000000000000000000000000000000000000000000000000000000000", + "0xc518010000000000000000000000000000000000000000000000000000000000", + "0xc52a010000000000000000000000000000000000000000000000000000000000", + "0xc52b010000000000000000000000000000000000000000000000000000000000" + ], + "validatorContainerProof": [ + "0xb03a2588d294a92612b710a38564aaade00dc888b9dbf8f82a549cc0c2995c88", + "0x13cb45c01b43725d52e07edd6cc8451bd25f26ccfc59c6b2db8dad34cf7c7116", + "0x4890fff5b0d7d1f92edd15b00aa4a8a9851506bfe423ab06ecf4a6479ef9faa2", + "0xba14ff630570a378edd1994f9597a8388dab0f46b4a34eff45c08d97230d1c11", + "0xe9a404b73746c38a9cf9e12ce710e01b90a4a360ec3bc567fc6e2dd5dd251cee", + "0xa4bde11e15ae7968f443a770797b2cdcb19bec5710719431ddaa97ee66eb8018", + "0x11ee43bff94966a08c3f42bc1056c4245cb2cfa7599280c04554a9f6580df2ab", + "0x36e70c535854b909d215719144e661fdecf9771d35dc8cf3c67b31e1fa8878af", + "0x0d15691d79b773b3a4b7047a0788ff840cff69191bb852767092faab8ad27448", + "0x65e97e0f21dcec0cbeb94c51ba2aa4164a320797564d58a95fcc3db3b166243e", + "0xe76bad8c69ef5b05a9cfdcbaffb4099b9a617828e2f4988fa3ebf2f811da705f", + "0x7ff887c4985360e343a5111587f99c94bdc6ebeff3f7ec9c8d2825da4da8f200", + "0xaf1725616432dbd54a439b82f1c2061c726dbc2ff8f857809602c33dab28e113", + "0x687a3beeae08885233891dd925703f2ffc0ea6a7f7f5c8dbc91c02c7698b9ca6", + "0xfabe0f0ae8486ee160a03d729be9ce3bb13237aa235e9c8811a571c0d0d7316b", + "0x95ef4650c4b16aa7d0931b144d61ee2e1e1e5a5d118f0a608321c2098bb60361", + "0xb1f0580fe88c70d0511212e3fad2d23e28c17a7ab2f9013e20b1d20b3dbb286b", + "0x9ef308a713148a797aa38e443b5e857fa14ddc0578b91a38a7b1f7a2e733ba31", + "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x9f2a0e49471f62442c3be5661b0bb16ef1fd474f2adc94befaa80efbf8ba0176", + "0x2de771848e2f15fefad6a2f6086564d980e3863a78b817bce1cd4084d50d451c", + "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7", + "0xc6f67e02e6e4e1bdefb994c6098953f34636ba2b6ca20a4721d2b26a886722ff", + "0x1c9a7e5ff1cf48b4ad1582d3f4e4a1004f3b20d8c5a2b71387a4254ad933ebc5", + "0x2f075ae229646b6f6aed19a5e372cf295081401eb893ff599b3f9acc0c0d3e7d", + "0x328921deb59612076801e8cd61592107b5c67c79b846595cc6320c395b46362c", + "0xbfb909fdb236ad2411b4e4883810a074b840464689986c3f8a8091827e17c327", + "0x55d8fb3687ba3ba49f342c77f5a1f89bec83d811446e1a467139213d640b6a74", + "0xf7210d4f8e7e1039790e7bf4efa207555a10a6db1dd4b95da313aaa88b88fe76", + "0xad21b516cbc645ffe34ab5de1c8aef8cd4e7f8d2b51e8e1456adc7563cda206f", + "0x228a1b0000000000000000000000000000000000000000000000000000000000", + "0x2aa2050000000000000000000000000000000000000000000000000000000000", + "0x619af53bf7854d1f7c047d640d052eb164a27e9ce71f2c9ce3745a04d6a9cc0a", + "0xf60e1933d0ddd62e24d5062e6e1cabc29643f5e7a2ba47f72ceab47513437608", + "0x634299373dcdc32bfe0117dd0ca920a1fb0a5c0c85ebc26a53a2e027056db0e5", + "0xa62ec0b0e9c2f768214a3305c986379619351f417360ed2369988c0030481fdd" + ], + "historicalSummaryBlockRoot": "0xf2b04858ab4051cb64e4409a01f7549222e574f13caebeb85b2decbf7593029c", + "historicalSummaryBlockRootProof": [ + "0xf134ff9bb517f6257d8589e9e9422aa1f5dbc3b3dd4dc53593ef9c013103919e", + "0xbb1640c9360183d0175fd905f04de59e9b6878a0009b6e0f0ce25ebbf4d8d9e7", + "0xb2cfcc6afff4967d305499d78fc04e0a4c913c5f652afacfcb7ec3a3605a98e5", + "0xa38c5e3cb7988b35daffd5dccf0c182e8f254c201d63eba7c32b51f7df5ece31", + "0xe206546ac21c200c882d6ebc5b8142c6196c0598de5db9e07bf2c02758438032", + "0x1bd5de7d972228f0719bb33de64ba323a3bac5d103dd6bbad44dff9fc7996e2d", + "0x270afbf95d482d1a9e6670424b6554f4ac304ac3cde9493e62283b372a4ed3dd", + "0x84d1d81013e7154228e5d87617ccb375cfa86989681f5218b9f3530781c0f07f", + "0x0d3ca99068bee31d0ae644bc754d951f5de4bda39c8b5a639169fe709531f840", + "0x2c863a8f005ebec920d24b2c3da2bf0403ae0f0a6ec6eab22bbb307b23032705", + "0xa4e91dd3c75a24a4faa3d977de41d52267b3916a0eb150e60501c68b46119394", + "0xd5237f90768a9413b0650d314f44af4ba2bfadcc661bb6c02db04eb77e5e006e", + "0x5058cebb8eb2ea532d362e92bf186be3e5811a38618277748ae1ae462c5e3cf7", + "0xbb9d84f818d967d1247b4276920f1ea1dd25be6ffae02f571a86a36381d8ea09", + "0x7ba29138bd70e5ea46cf14512097513dbf45dec679207e5a9778c7a708f9c173", + "0x5f091fc3ae6dd27b0ae0730dd559f917ed6ddb99143b8fc9d223d0b348871e58", + "0xba409ccda07d7232ba44374c6f83da902df433c572809fd1345780e78cf7c26d", + "0x71f20b9798cf242bf1bbda578e06384ba0f375639c9c6a2a64bdfb8950058d8c", + "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x6e24b066b1f1c6bc87ea37d1f2da7b5238dc458482b5913116905075edf57882", + "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0xbca40e0a6f835405afd7bd6d71493b200f6257fe6fc375ccce150a4f083520b3", + "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x2f01000000000000000000000000000000000000000000000000000000000000", + "0xca2a0d0000000000000000000000000000000000000000000000000000000000", + "0x94b06500ddc50e3aca5781c4c43b0be7a4aef67ccab670175fa8d3c261f84e96", + "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0xdefed8f86db7698dd96a32c691fe9853a86c25736f41eddad150212a18fbb83f", + "0xe51f2543d19216283850741512f87e65855bc4ea7847500d0dff5f42bbc93801" + ], + "slotRoot": "0x01ba250000000000000000000000000000000000000000000000000000000000", + "slotRootProof": [ + "0x3c78070000000000000000000000000000000000000000000000000000000000", + "0x558a6352adf4e7b709b5c0f2e01734fff424b0a15d709329bc4628a86a88fcfc", + "0x3e5b820efbef3cc42f91cacbd446d821d0a7edd9ca571b7a97cb5c9119d3b93b" + ], + "timestampRoot": "0xcc22da6600000000000000000000000000000000000000000000000000000000", + "timestampRootProof": [ + "0xd33b3d0000000000000000000000000000000000000000000000000000000000", + "0x6900bf2225bdf4fc44d0631f97ad158156cb335bb7f2a437e94ef18f43116fcd", + "0xb4fec525335ab7b1ebdb737b9e5baae967c58624bd6435fb88bbe44f4553ad84", + "0x109dd23888e1bf90acd3350acaa86ddef1135b040412f950ad942ea30b1e2666", + "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c" + ], + "executionPayloadRoot": "0xc0d6724d2c76d574fefbf96b7d4c6487374b6ab1c28df803cd2e38744b57bb2b", + "executionPayloadRootProof": [ + "0xc67bac59edfda4047c1036181edc61bcf09f654bbde6f9a2506190a0cabe9715", + "0x848d2d410ae5d3471e00294424caf2028114f7d34f7ecce243a3244c090857ea", + "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0xfceafa58f9cd06cd1dbb60a0932906c06df47eec53d2f09a12628fd4c96366c8", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0xd0483b055b851afbe5d378d1b5ec98d17f9edae2176dbfc40d5621680512d11a" + ], + "withdrawalContainer": [ + "0x5245290200000000000000000000000000000000000000000000000000000000", + "0xd0651b0000000000000000000000000000000000000000000000000000000000", + "0x87bc52e992a299744f238fb7225bb3641a778507000000000000000000000000", + "0xa7f1837307000000000000000000000000000000000000000000000000000000" + ], + "withdrawalContainerProof": [ + "0xe8a02f634fa679aac17032159c6de5a18cabbea0b361ef8c87b989d67841d730", + "0x1ae1ffdf6464af5ee8f72bcc1f8110c03fd2cffa8be804c82eeda27fcccc515b", + "0xedb99e6c597f6665f32290fb4a6ead5e3c2ac1ba176408e3820fb0196c8059f6", + "0x85963fa34c33b3d08619423d6002e22b6895f009bc2cd92c3b08dddc54a2d742", + "0x1000000000000000000000000000000000000000000000000000000000000000", + "0x0000060000000000000000000000000000000000000000000000000000000000", + "0x8c2ca697cc7fa6c64fdf7a4379dd5d2e0614bbaa52a7d47c341b3a0e6180aabd", + "0xfa1f3a34d8ad04f91b1472078402ab75018cb83d257af951002beb7f30560159", + "0x109dd23888e1bf90acd3350acaa86ddef1135b040412f950ad942ea30b1e2666", + "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c" + ], + "historicalSummaryIndex": "300", + "blockRootIndex": "6657", + "withdrawalIndexWithinBlock": "10" +} \ No newline at end of file