From 47e789b9e96569e4708dfaa11597a70a5bd9dfa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keszey=20D=C3=A1niel?= Date: Wed, 27 Nov 2024 13:36:49 +0100 Subject: [PATCH 01/24] Try hook revm and revm-inspectors hook into gwyneth for testing --- Cargo.toml | 11 +++++---- crates/ethereum/evm/src/lib.rs | 4 ++-- crates/evm/src/lib.rs | 7 +++++- crates/primitives-traits/src/constants/mod.rs | 4 ++++ crates/primitives/src/transaction/compat.rs | 24 ++++++++++++------- crates/rpc/rpc-eth-api/src/helpers/call.rs | 6 ++++- 6 files changed, 39 insertions(+), 17 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d2ad596afb16..910e07ff49de 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -566,8 +566,9 @@ tempfile = "3.8" test-fuzz = "5" [patch.crates-io] -revm = { git = "https://github.com/taikoxyz/revm.git", branch = "v43-gwyneth" } -revm-primitives = { git = "https://github.com/taikoxyz/revm.git", branch = "v43-gwyneth" } -revm-interpreter = { git = "https://github.com/taikoxyz/revm.git", branch = "v43-gwyneth" } -revm-precompile = { git = "https://github.com/taikoxyz/revm.git", branch = "v43-gwyneth" } -revm-inspectors = { git = "https://github.com/taikoxyz/revm-inspectors.git", branch = "main-rbuilder" } \ No newline at end of file +revm = { git = "https://github.com/taikoxyz/revm.git", branch = "gwyneth-debug-shit" } +revm-primitives = { git = "https://github.com/taikoxyz/revm.git", branch = "gwyneth-debug-shit" } +revm-interpreter = { git = "https://github.com/taikoxyz/revm.git", branch = "gwyneth-debug-shit" } +revm-precompile = { git = "https://github.com/taikoxyz/revm.git", branch = "gwyneth-debug-shit" } +revm-inspectors = { git = "https://github.com/taikoxyz/revm-inspectors.git", branch = "main-rbuilder" } +# local patches trial-errors: revm-inspectors = { path = "../../revm-inspectors/revm-inspectors"} \ No newline at end of file diff --git a/crates/ethereum/evm/src/lib.rs b/crates/ethereum/evm/src/lib.rs index bd5b5b72e62d..dab46633d75a 100644 --- a/crates/ethereum/evm/src/lib.rs +++ b/crates/ethereum/evm/src/lib.rs @@ -57,7 +57,7 @@ impl ConfigureEvmEnv for EthEvmConfig { }, ); - cfg_env.chain_id = chain_spec.chain().id(); + //cfg_env.chain_id = chain_spec.chain().id(); cfg_env.perf_analyse_created_bytecodes = AnalysisKind::Analyse; cfg_env.handler_cfg.spec_id = spec_id; @@ -88,7 +88,7 @@ impl ConfigureEvmEnv for EthEvmConfig { // call, and that the call will not count against the block's gas limit gas_price: U256::ZERO, // The chain ID check is not relevant here and is disabled if set to None - chain_id: None, + chain_ids: None, // Setting the gas priority fee to None ensures the effective gas price is derived from // the `gas_price` field, which we need to be zero gas_priority_fee: None, diff --git a/crates/evm/src/lib.rs b/crates/evm/src/lib.rs index ca307330635b..3078611cab87 100644 --- a/crates/evm/src/lib.rs +++ b/crates/evm/src/lib.rs @@ -29,6 +29,9 @@ pub mod noop; pub mod provider; pub mod system_calls; + +use reth_primitives::constants::{BASE_CHAIN_ID, NUM_L2_CHAINS}; + #[cfg(any(test, feature = "test-utils"))] /// test helpers for mocking executor pub mod test_utils; @@ -60,7 +63,9 @@ pub trait ConfigureEvm: ConfigureEvmEnv { let mut evm = self.evm(db); evm.modify_spec_id(env.spec_id()); evm.context.evm.env = env.env; - evm.tx_mut().chain_id = Some(evm.cfg().chain_id); + evm.tx_mut().chain_ids = Some((0..NUM_L2_CHAINS) + .map(|i| BASE_CHAIN_ID + i) + .collect()); evm } diff --git a/crates/primitives-traits/src/constants/mod.rs b/crates/primitives-traits/src/constants/mod.rs index ffb77a069dba..4348f252b062 100644 --- a/crates/primitives-traits/src/constants/mod.rs +++ b/crates/primitives-traits/src/constants/mod.rs @@ -37,6 +37,10 @@ pub const BEACON_NONCE: u64 = 0u64; pub const ETHEREUM_BLOCK_GAS_LIMIT: u64 = 30_000_000; pub const ETHEREUM_CHAIN_ID: u64 = 1; +pub const BASE_CHAIN_ID: u64 = 167010; // or whatever value you want to use + +/// Number of L2 chains to create +pub const NUM_L2_CHAINS: u64 = 2; // or whatever number you need /// The minimum tx fee below which the txpool will reject the transaction. /// diff --git a/crates/primitives/src/transaction/compat.rs b/crates/primitives/src/transaction/compat.rs index 5e5874653fe4..7f13b90fd93b 100644 --- a/crates/primitives/src/transaction/compat.rs +++ b/crates/primitives/src/transaction/compat.rs @@ -4,6 +4,10 @@ use revm_primitives::{AuthorizationList, ChainAddress, TransactTo, TxEnv, TxKind #[cfg(all(not(feature = "std"), feature = "optimism"))] use alloc::vec::Vec; +// Hard code for now. +const BASE_CHAIN_ID: u64 = 167010; // Low level crate, should not depend on gwyneth but we need this info, just hard-code now! +const NUM_L2_CHAINS: u64 = 2; + /// Implements behaviour to fill a [`TxEnv`] from another transaction. pub trait FillTxEnv { /// Fills [`TxEnv`] with an [`Address`] and transaction. @@ -18,11 +22,15 @@ impl FillTxEnv for TransactionSigned { self.encode_enveloped(&mut envelope); envelope }; + + let chain_ids = Some((0..NUM_L2_CHAINS) + .map(|i| BASE_CHAIN_ID + i) + .collect::>()); let chain_id = self - .transaction - .chain_id() - .unwrap_or_else(|| tx_env.chain_id.expect(&format!("chain_id is None for Tx {:?}", &self))); + .transaction + .chain_id() + .unwrap_or_else(|| chain_ids.as_ref().map(|ids| ids[0]).unwrap_or(BASE_CHAIN_ID)); tx_env.caller = ChainAddress(chain_id, sender); match self.as_ref() { @@ -33,7 +41,7 @@ impl FillTxEnv for TransactionSigned { tx_env.transact_to = convert_tx_kind(chain_id, tx.to); tx_env.value = tx.value; tx_env.data = tx.input.clone(); - tx_env.chain_id = tx.chain_id; + tx_env.chain_ids = chain_ids; tx_env.nonce = Some(tx.nonce); tx_env.access_list.clear(); tx_env.blob_hashes.clear(); @@ -47,7 +55,7 @@ impl FillTxEnv for TransactionSigned { tx_env.transact_to = convert_tx_kind(chain_id, tx.to); tx_env.value = tx.value; tx_env.data = tx.input.clone(); - tx_env.chain_id = Some(tx.chain_id); + tx_env.chain_ids = chain_ids; tx_env.nonce = Some(tx.nonce); tx_env.access_list.clone_from(&tx.access_list.0); tx_env.blob_hashes.clear(); @@ -61,7 +69,7 @@ impl FillTxEnv for TransactionSigned { tx_env.transact_to = convert_tx_kind(chain_id, tx.to); tx_env.value = tx.value; tx_env.data = tx.input.clone(); - tx_env.chain_id = Some(tx.chain_id); + tx_env.chain_ids = chain_ids; tx_env.nonce = Some(tx.nonce); tx_env.access_list.clone_from(&tx.access_list.0); tx_env.blob_hashes.clear(); @@ -75,7 +83,7 @@ impl FillTxEnv for TransactionSigned { tx_env.transact_to = TransactTo::Call(ChainAddress(chain_id, tx.to)); tx_env.value = tx.value; tx_env.data = tx.input.clone(); - tx_env.chain_id = Some(tx.chain_id); + tx_env.chain_ids = chain_ids; tx_env.nonce = Some(tx.nonce); tx_env.access_list.clone_from(&tx.access_list.0); tx_env.blob_hashes.clone_from(&tx.blob_versioned_hashes); @@ -89,7 +97,7 @@ impl FillTxEnv for TransactionSigned { tx_env.transact_to = convert_tx_kind(chain_id, tx.to); tx_env.value = tx.value; tx_env.data = tx.input.clone(); - tx_env.chain_id = Some(tx.chain_id); + tx_env.chain_ids = chain_ids; tx_env.nonce = Some(tx.nonce); tx_env.access_list.clone_from(&tx.access_list.0); tx_env.blob_hashes.clear(); diff --git a/crates/rpc/rpc-eth-api/src/helpers/call.rs b/crates/rpc/rpc-eth-api/src/helpers/call.rs index 323c63400fd2..1e347d1390d0 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/call.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/call.rs @@ -15,6 +15,8 @@ use reth_primitives::{ transaction::AccessListResult, Bytes, TransactionSignedEcRecovered, TxKind, B256, U256, }; + +use reth_primitives::constants::{BASE_CHAIN_ID, NUM_L2_CHAINS}; use reth_provider::{ChainSpecProvider, StateProvider}; use reth_revm::{ database::{CachedDBSyncStateProvider, StateProviderDatabase, SyncStateProviderDatabase}, @@ -919,7 +921,9 @@ pub trait Call: LoadState + SpawnBlocking { .try_into_unique_input() .map_err(Self::Error::from_eth_err)? .unwrap_or_default(), - chain_id, + chain_ids: Some((0..NUM_L2_CHAINS) + .map(|i| BASE_CHAIN_ID + i) + .collect::>()), access_list: access_list.unwrap_or_default().into(), // EIP-4844 fields blob_hashes: blob_versioned_hashes.unwrap_or_default(), From aa13828873fe165b55c1bae8d7f792d27f16beab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keszey=20D=C3=A1niel?= Date: Thu, 28 Nov 2024 11:01:06 +0100 Subject: [PATCH 02/24] add boilerplate for match tracer --- crates/rpc/rpc/src/debug.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/rpc/rpc/src/debug.rs b/crates/rpc/rpc/src/debug.rs index 810596c27391..3eff5a3deed7 100644 --- a/crates/rpc/rpc/src/debug.rs +++ b/crates/rpc/rpc/src/debug.rs @@ -395,6 +395,7 @@ where .await?; return Ok(frame) } + _ => unimplemented!(), }, #[cfg(not(feature = "js-tracer"))] GethDebugTracerType::JsTracer(_) => { From 75ff5b437687fb72790532f16fd3a9090e5412d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keszey=20D=C3=A1niel?= Date: Fri, 29 Nov 2024 12:43:06 +0100 Subject: [PATCH 03/24] fix spec chain_id issue --- crates/ethereum/evm/src/lib.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/ethereum/evm/src/lib.rs b/crates/ethereum/evm/src/lib.rs index dab46633d75a..6cd3277c4e27 100644 --- a/crates/ethereum/evm/src/lib.rs +++ b/crates/ethereum/evm/src/lib.rs @@ -57,7 +57,7 @@ impl ConfigureEvmEnv for EthEvmConfig { }, ); - //cfg_env.chain_id = chain_spec.chain().id(); + cfg_env.chain_id = chain_spec.chain().id(); cfg_env.perf_analyse_created_bytecodes = AnalysisKind::Analyse; cfg_env.handler_cfg.spec_id = spec_id; @@ -74,8 +74,11 @@ impl ConfigureEvmEnv for EthEvmConfig { contract: Address, data: Bytes, ) { + print!("fill_tx_env_system_contract_call: 1"); #[allow(clippy::needless_update)] // side-effect of optimism fields let chain_id = env.cfg.chain_id; + + print!("Dani Chain id:{:?}", chain_id); let tx = TxEnv { caller: ChainAddress(chain_id, caller), transact_to: TransactTo::Call(ChainAddress(chain_id, contract)), @@ -101,6 +104,8 @@ impl ConfigureEvmEnv for EthEvmConfig { }; env.tx = tx; + print!("fill_tx_env_system_contract_call: 2"); + // ensure the block gas limit is >= the tx env.block.gas_limit = U256::from(env.tx.gas_limit); From 11dcf72aeb091f82383469cbcd2e5340721d9b55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keszey=20D=C3=A1niel?= Date: Mon, 2 Dec 2024 15:14:17 +0100 Subject: [PATCH 04/24] prepend L1 chain id --- crates/evm/src/lib.rs | 6 +++--- crates/primitives-traits/src/constants/mod.rs | 1 + crates/primitives/src/transaction/compat.rs | 6 ++++-- crates/rpc/rpc-eth-api/src/helpers/call.rs | 7 ++++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/crates/evm/src/lib.rs b/crates/evm/src/lib.rs index 3078611cab87..34c5a35a512a 100644 --- a/crates/evm/src/lib.rs +++ b/crates/evm/src/lib.rs @@ -30,7 +30,7 @@ pub mod provider; pub mod system_calls; -use reth_primitives::constants::{BASE_CHAIN_ID, NUM_L2_CHAINS}; +use reth_primitives::constants::{BASE_CHAIN_ID, NUM_L2_CHAINS, L1_CHAIN_ID}; #[cfg(any(test, feature = "test-utils"))] /// test helpers for mocking executor @@ -63,8 +63,8 @@ pub trait ConfigureEvm: ConfigureEvmEnv { let mut evm = self.evm(db); evm.modify_spec_id(env.spec_id()); evm.context.evm.env = env.env; - evm.tx_mut().chain_ids = Some((0..NUM_L2_CHAINS) - .map(|i| BASE_CHAIN_ID + i) + evm.tx_mut().chain_ids = Some(std::iter::once(L1_CHAIN_ID) + .chain((0..NUM_L2_CHAINS).map(|i| BASE_CHAIN_ID + i)) .collect()); evm diff --git a/crates/primitives-traits/src/constants/mod.rs b/crates/primitives-traits/src/constants/mod.rs index 4348f252b062..22957def87ee 100644 --- a/crates/primitives-traits/src/constants/mod.rs +++ b/crates/primitives-traits/src/constants/mod.rs @@ -38,6 +38,7 @@ pub const ETHEREUM_BLOCK_GAS_LIMIT: u64 = 30_000_000; pub const ETHEREUM_CHAIN_ID: u64 = 1; pub const BASE_CHAIN_ID: u64 = 167010; // or whatever value you want to use +pub const L1_CHAIN_ID: u64 = 160010; /// Number of L2 chains to create pub const NUM_L2_CHAINS: u64 = 2; // or whatever number you need diff --git a/crates/primitives/src/transaction/compat.rs b/crates/primitives/src/transaction/compat.rs index 7f13b90fd93b..6d12513be037 100644 --- a/crates/primitives/src/transaction/compat.rs +++ b/crates/primitives/src/transaction/compat.rs @@ -7,6 +7,7 @@ use alloc::vec::Vec; // Hard code for now. const BASE_CHAIN_ID: u64 = 167010; // Low level crate, should not depend on gwyneth but we need this info, just hard-code now! const NUM_L2_CHAINS: u64 = 2; +const L1_CHAIN_ID: u64 = 160010; /// Implements behaviour to fill a [`TxEnv`] from another transaction. pub trait FillTxEnv { @@ -23,8 +24,9 @@ impl FillTxEnv for TransactionSigned { envelope }; - let chain_ids = Some((0..NUM_L2_CHAINS) - .map(|i| BASE_CHAIN_ID + i) + let chain_ids = Some(std::iter::once(L1_CHAIN_ID) + .chain((0..NUM_L2_CHAINS) + .map(|i| BASE_CHAIN_ID + i)) .collect::>()); let chain_id = self diff --git a/crates/rpc/rpc-eth-api/src/helpers/call.rs b/crates/rpc/rpc-eth-api/src/helpers/call.rs index 1e347d1390d0..c1cc851b4076 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/call.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/call.rs @@ -16,7 +16,7 @@ use reth_primitives::{ Bytes, TransactionSignedEcRecovered, TxKind, B256, U256, }; -use reth_primitives::constants::{BASE_CHAIN_ID, NUM_L2_CHAINS}; +use reth_primitives::constants::{BASE_CHAIN_ID, NUM_L2_CHAINS, L1_CHAIN_ID}; use reth_provider::{ChainSpecProvider, StateProvider}; use reth_revm::{ database::{CachedDBSyncStateProvider, StateProviderDatabase, SyncStateProviderDatabase}, @@ -921,8 +921,9 @@ pub trait Call: LoadState + SpawnBlocking { .try_into_unique_input() .map_err(Self::Error::from_eth_err)? .unwrap_or_default(), - chain_ids: Some((0..NUM_L2_CHAINS) - .map(|i| BASE_CHAIN_ID + i) + chain_ids: Some(std::iter::once(L1_CHAIN_ID) + .chain((0..NUM_L2_CHAINS) + .map(|i| BASE_CHAIN_ID + i)) .collect::>()), access_list: access_list.unwrap_or_default().into(), // EIP-4844 fields From de04e0c1e138a6c94a73323376058ccb5662cbc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keszey=20D=C3=A1niel?= Date: Tue, 3 Dec 2024 13:59:18 +0100 Subject: [PATCH 05/24] try xCall --- packages/protocol/contracts/examples/EVM.sol | 68 +++++++++++++++ .../protocol/contracts/examples/xERC20.sol | 80 ++++++++++++++++++ packages/protocol/scripts/DeployXERC20.s.sol | 25 ++++++ .../protocol/scripts/deploy_and_xtransfer.sh | 82 +++++++++++++++++++ packages/protocol/scripts/setup_deps.sh | 3 +- packages/protocol/scripts/xTransfer.s.sol | 35 ++++++++ 6 files changed, 292 insertions(+), 1 deletion(-) create mode 100644 packages/protocol/contracts/examples/EVM.sol create mode 100644 packages/protocol/contracts/examples/xERC20.sol create mode 100644 packages/protocol/scripts/DeployXERC20.s.sol create mode 100755 packages/protocol/scripts/deploy_and_xtransfer.sh create mode 100644 packages/protocol/scripts/xTransfer.s.sol diff --git a/packages/protocol/contracts/examples/EVM.sol b/packages/protocol/contracts/examples/EVM.sol new file mode 100644 index 000000000000..d72ab7b10e66 --- /dev/null +++ b/packages/protocol/contracts/examples/EVM.sol @@ -0,0 +1,68 @@ +// SPDX-License-Identifier: MIT + +pragma solidity >=0.8.12 <0.9.0; + +// EVM library +library EVM { + // precompile addresses + address constant xCallOptionsAddress = address(0x04D2); + + uint constant l1ChainId = 1; + uint constant version = 1; + + function xCallOnL1() + public + view + { + xCallOptions(l1ChainId); + } + + function xCallOptions(uint chainID) + public + view + { + xCallOptions(chainID, true); + } + + function xCallOptions(uint chainID, bool sandbox) + public + view + { + xCallOptions(chainID, sandbox, address(0), address(0)); + } + + function xCallOptions(uint chainID, bool sandbox, address txOrigin, address msgSender) + public + view + { + xCallOptions(chainID, sandbox, txOrigin, msgSender, 0x0, ""); + } + + function xCallOptions(uint chainID, bool sandbox, bytes32 blockHash, bytes memory proof) + public + view + { + xCallOptions(chainID, sandbox, address(0), address(0), blockHash, proof); + } + + function xCallOptions(uint chainID, bool sandbox, address txOrigin, address msgSender, bytes32 blockHash, bytes memory proof) + public + view + { + // This precompile is not supported on L1 + require(chainID != l1ChainId); + + // Call the custom precompile + bytes memory input = abi.encodePacked(version, chainID, sandbox, txOrigin, msgSender, blockHash, proof); + (bool success, ) = xCallOptionsAddress.staticcall(input); + require(success); + } + + function isOnL1() public view returns (bool) { + return chainId() == l1ChainId; + } + + function chainId() public view returns (uint256) { + return block.chainid; + } +} \ No newline at end of file diff --git a/packages/protocol/contracts/examples/xERC20.sol b/packages/protocol/contracts/examples/xERC20.sol new file mode 100644 index 000000000000..954e26abdbe5 --- /dev/null +++ b/packages/protocol/contracts/examples/xERC20.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "./EVM.sol"; + +contract xERC20 { + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + + constructor(uint256 totalSupply) { + balanceOf[msg.sender] = totalSupply; + } + + function transfer(address to, uint256 value) public returns (uint256) { + require(balanceOf[msg.sender] >= value, "Insufficient balance"); + balanceOf[msg.sender] -= value; + balanceOf[to] += value; + emit Transfer(msg.sender, to, value); + return value; + } + + function _transfer(address from, address to, uint256 value) public returns (uint256) { + require(msg.sender == address(this), "Only this contract can mint"); + balanceOf[from] -= value; + balanceOf[to] += value; + return value; + } + + function _mint(address to, uint256 value) public returns (uint256) { + require(msg.sender == address(this), "Only this contract can mint"); + balanceOf[to] += value; + return value; + } + + function xTransfer(uint256 chain, address to, uint256 value) public returns (uint256) { + balanceOf[msg.sender] -= value; + EVM.xCallOptions(chain); + return this._mint(to, value); + } + + function sandboxedTransfer(uint256 chain, address to, uint256 value) public returns (uint256) { + EVM.xCallOptions(chain, true); + return this._transfer(msg.sender, to, value); + } + + function approve(address spender, uint256 value) public returns (uint256) { + allowance[msg.sender][spender] = value; + emit Approval(msg.sender, spender, value); + return value; + } + + function _approve(address owner, address spender, uint256 value) public returns (uint256) { + require(msg.sender == address(this), "Only contract itself can call this function"); + allowance[owner][spender] = value; + emit Approval(owner, spender, value); + return value; + } + + function xApprove(uint256 chain, address spender, uint256 value) public returns (uint256) { + EVM.xCallOptions(chain); + return this._approve(msg.sender, spender, value); + } + + function transferFrom(address from, address to, uint256 value) public returns (uint256) { + require(balanceOf[from] >= value, "Insufficient balance"); + if (from != msg.sender) { + require(allowance[from][msg.sender] >= value, "Allowance exceeded"); + } + balanceOf[from] -= value; + balanceOf[to] += value; + if (from != msg.sender) { + allowance[from][msg.sender] -= value; + } + emit Transfer(from, to, value); + return value; + } +} diff --git a/packages/protocol/scripts/DeployXERC20.s.sol b/packages/protocol/scripts/DeployXERC20.s.sol new file mode 100644 index 000000000000..6518ca5b4089 --- /dev/null +++ b/packages/protocol/scripts/DeployXERC20.s.sol @@ -0,0 +1,25 @@ +pragma solidity ^0.8.20; + +import "forge-std/Script.sol"; +import "forge-std/console2.sol"; + +import "../contracts/examples/xERC20.sol"; + +// forge script --rpc-url http://127.0.0.1:8545 +//script/DeployOnL1.s.sol -vvvv --broadcast --private-key +// 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 +contract DeployXERC20 is Script { + uint256 public adminPrivateKey = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; + + function run() external { + require(adminPrivateKey != 0, "PRIVATE_KEY not set"); + + vm.startBroadcast(adminPrivateKey); + + address xERC20 = address(new xERC20(99999)); + + console2.log("xERC20 address is:", xERC20); + + vm.stopBroadcast(); + } +} diff --git a/packages/protocol/scripts/deploy_and_xtransfer.sh b/packages/protocol/scripts/deploy_and_xtransfer.sh new file mode 100755 index 000000000000..a540399b5984 --- /dev/null +++ b/packages/protocol/scripts/deploy_and_xtransfer.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +# Colors for output +GREEN='\033[0;32m' +RED='\033[0;31m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Contract address we expect after deployment +CONTRACT_ADDRESS="0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" + +# Function to check if contract is deployed +check_contract_deployment() { + local rpc_url=$1 + local retries=30 # Number of retries (30 * 2 = 60 seconds max wait) + local deployed=false + + echo -e "${YELLOW}Waiting for contract deployment confirmation...${NC}" + + for i in $(seq 1 $retries); do + # Using curl to check if the contract code exists at the address + result=$(curl -s -X POST -H "Content-Type: application/json" --data "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getCode\",\"params\":[\"$CONTRACT_ADDRESS\", \"latest\"],\"id\":1}" $rpc_url) + + # Check if the result contains more than just "0x" (empty contract) + if [[ $result == *"0x60806040"* ]]; then + deployed=true + break + fi + + echo -e "${YELLOW}Attempt $i/$retries: Contract not yet deployed, waiting...${NC}" + sleep 2 + done + + if [ "$deployed" = true ]; then + echo -e "${GREEN}Contract deployment confirmed!${NC}" + return 0 + else + echo -e "${RED}Contract deployment could not be confirmed after $retries attempts${NC}" + return 1 + fi +} + +echo -e "${GREEN}Deploying to L2A...${NC}" +forge script --rpc-url http://127.0.0.1:32005 scripts/DeployXERC20.s.sol -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy + +if [ $? -eq 0 ]; then + # Check if contract is deployed on L2A + if check_contract_deployment "http://127.0.0.1:32005"; then + echo -e "${GREEN}Verifying L2A contract...${NC}" + forge verify-contract "$CONTRACT_ADDRESS" "contracts/examples/xERC20.sol:xERC20" --watch --verifier-url "http://localhost:64003/api" --verifier blockscout --chain-id 167010 --libraries contracts/examples/EVM.sol:EVM:0x5FbDB2315678afecb367f032d93F642f64180aa3 + else + echo -e "${RED}L2A deployment verification failed. Stopping.${NC}" + exit 1 + fi +else + echo -e "${RED}L2A deployment failed. Stopping.${NC}" + exit 1 +fi + +echo -e "${GREEN}Deploying to L2B...${NC}" +forge script --rpc-url http://127.0.0.1:32006 scripts/DeployXERC20.s.sol -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy + +if [ $? -eq 0 ]; then + # Check if contract is deployed on L2B + if check_contract_deployment "http://127.0.0.1:32006"; then + echo -e "${GREEN}Verifying L2B contract...${NC}" + forge verify-contract "$CONTRACT_ADDRESS" "contracts/examples/xERC20.sol:xERC20" --watch --verifier-url "http://localhost:64005/api" --verifier blockscout --chain-id 167011 --libraries contracts/examples/EVM.sol:EVM:0x5FbDB2315678afecb367f032d93F642f64180aa3 + else + echo -e "${RED}L2B deployment verification failed. Stopping.${NC}" + exit 1 + fi +else + echo -e "${RED}L2B deployment failed. Stopping.${NC}" + exit 1 +fi + +# Add a delay before xTransfer to ensure everything is ready +echo -e "${YELLOW}Waiting 5 seconds before executing xTransfer...${NC}" +sleep 5 + +echo -e "${GREEN}Executing xTransfer...${NC}" +forge script scripts/XTransfer.s.sol --rpc-url http://127.0.0.1:32005 -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy \ No newline at end of file diff --git a/packages/protocol/scripts/setup_deps.sh b/packages/protocol/scripts/setup_deps.sh index eefddfdc78d3..40137fe1cfbe 100755 --- a/packages/protocol/scripts/setup_deps.sh +++ b/packages/protocol/scripts/setup_deps.sh @@ -185,7 +185,8 @@ RUN_LATEST_PATH=$(echo "$FORGE_OUTPUT" | grep "Transactions saved to:" | sed 's/ echo "Starting contract verification..." BLOCKSCOUT_PORT=$(cat /tmp/kurtosis_blockscout_port) SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" -"$SCRIPT_DIR/verify_contracts.sh" "$BLOCKSCOUT_PORT" "$RUN_LATEST_PATH" +# SKIP THIS FOR NOW +# "$SCRIPT_DIR/verify_contracts.sh" "$BLOCKSCOUT_PORT" "$RUN_LATEST_PATH" # Ensure the log file exists in the current working directory touch ./rbuilder.log diff --git a/packages/protocol/scripts/xTransfer.s.sol b/packages/protocol/scripts/xTransfer.s.sol new file mode 100644 index 000000000000..02f578e3875b --- /dev/null +++ b/packages/protocol/scripts/xTransfer.s.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "forge-std/Script.sol"; +import "forge-std/console2.sol"; + +import "../contracts/examples/xERC20.sol"; + +contract XTransfer is Script { + // The deployed contract address (will be the same on both chains due to deterministic deployment) + address constant TOKEN_ADDRESS = 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512; + + address ALICE = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; //Can stay as is - test values anyways + address BOB = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; //Can stay as is - test values anyways + uint256 ALICE_PK = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80;//Can stay as is - test values anyways + + function setUp() public {} + + function run() public { + address alice = vm.addr(ALICE_PK); + + console.log("\n=== Before Transfer ==="); + //checkBalances(); -> EXPLORER + + vm.startBroadcast(ALICE_PK); + + // Transfer 666 tokens to Bob on L2B (chainId: 167011) + xERC20(TOKEN_ADDRESS).xTransfer(167011, BOB, 666); + + vm.stopBroadcast(); + + console.log("\n=== After Transfer ==="); + //checkBalances(); -> EXPLORER + } +} \ No newline at end of file From d301cbc068d32622312eacceb8d88c052f5ad1b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keszey=20D=C3=A1niel?= Date: Fri, 6 Dec 2024 09:43:25 +0100 Subject: [PATCH 06/24] chore: update Cargo.lock for gwyneth dependencies --- Cargo.lock | 2075 +++++++++++++++++++++++++++++----------------------- 1 file changed, 1148 insertions(+), 927 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 617993b8c497..92a47212ea70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,19 +4,13 @@ version = 3 [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -80,6 +74,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e0966165eaf052580bd70eb1b32cb3d6245774c0104d1b2793e9650bf83b52a" +dependencies = [ + "equator", +] + [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -97,16 +100,17 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.1.29" +version = "0.1.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb07629a5d0645d29f68d2fb6f4d0cf15c89ec0965be915f303967180929743f" +checksum = "18c5c520273946ecf715c0010b4e3503d7eba9893cd9ce6b7fff5654c4a3c470" dependencies = [ + "alloy-primitives 0.8.14", "alloy-rlp", "arbitrary", "num_enum", @@ -117,12 +121,12 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7198a527b4c4762cb88d54bcaeb0428f4298b72552c9c8ec4af614b4a4990c59" +checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "alloy-serde", "arbitrary", @@ -132,12 +136,12 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.7" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f95d76a38cae906fd394a5afb0736aaceee5432efe76addfd71048e623e208af" +checksum = "80759b3f57b3b20fa7cd8fef6479930fc95461b58ff8adea6e87e618449c8a1d" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-sol-type-parser", "alloy-sol-types", "const-hex", @@ -154,7 +158,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0069cf0642457f87a01a014f6dc29d5d893cd4fd8fddf0c3cdfad1bb3ebafc41" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "arbitrary", "rand 0.8.5", @@ -163,11 +167,11 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d319bb544ca6caeab58c39cea8921c55d924d4f68f2c60f24f914673f9a74a" +checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "arbitrary", "k256", @@ -177,13 +181,13 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "159eab0e4e15b88571f55673af37314f4b8f17630dc1b393c3d70f2128a1d494" +checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" dependencies = [ "alloy-eip2930", "alloy-eip7702", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "alloy-serde", "arbitrary", @@ -196,22 +200,22 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210f4b358d724f85df8adaec753c583defb58169ad3cad3d48c80d1a25a6ff0e" +checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-serde", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.7" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c66eec1acdd96b39b995b8f5ee5239bc0c871d62c527ae1ac9fd1d7fecd455" +checksum = "ac4b22b3e51cac09fd2adfcc73b55f447b4df669f983c13f7894ec82b607c63f" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-sol-type-parser", "serde", "serde_json", @@ -219,29 +223,29 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7733446dd531f8eb877331fea02f6c40bdbb47444a17dc3464bf75319cc073a" +checksum = "d3c717b5298fad078cd3a418335b266eba91b511383ca9bd497f742d5975d5ab" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-sol-types", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tracing", ] [[package]] name = "alloy-network" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b80851d1697fc4fa2827998e3ee010a3d1fc59c7d25e87070840169fcf465832" +checksum = "fb3705ce7d8602132bcf5ac7a1dd293a42adc2f183abf5907c30ac535ceca049" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rpc-types-eth", "alloy-serde", "alloy-signer", @@ -249,32 +253,34 @@ dependencies = [ "async-trait", "auto_impl", "futures-utils-wasm", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "alloy-network-primitives" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76a2336889f3d0624b18213239d27f4f34eb476eb35bef22f6a8cc24e0c0078" +checksum = "94ad40869867ed2d9cd3842b1e800889e5b49e6b92da346e93862b4a741bedf3" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-eips", + "alloy-primitives 0.8.14", "alloy-serde", "serde", ] [[package]] name = "alloy-node-bindings" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2657dae91ae61ed6cdd4c58b7e09330de934eea4e14d2f54f72f2a6720b23437" +checksum = "5988a227293f949525f0a1b3e1ef728d2ef24afa96bad2b7788c6c9617fa3eec" dependencies = [ "alloy-genesis", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "k256", + "rand 0.8.5", "serde_json", "tempfile", - "thiserror", + "thiserror 1.0.69", "tracing", "url", ] @@ -303,9 +309,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.7" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb848c43f6b06ae3de2e4a67496cbbabd78ae87db0f1248934f15d76192c6a" +checksum = "9db948902dfbae96a73c2fbf1f7abec62af034ab883e4c777c3fd29702bd6e2c" dependencies = [ "alloy-rlp", "arbitrary", @@ -316,9 +322,9 @@ dependencies = [ "derive_more 1.0.0", "foldhash", "getrandom 0.2.15", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "hex-literal", - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "k256", "keccak-asm", @@ -327,7 +333,7 @@ dependencies = [ "proptest-derive", "rand 0.8.5", "ruint", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "serde", "sha3", "tiny-keccak", @@ -335,9 +341,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d2a195caa6707f5ce13905794865765afc6d9ea92c3a56e3a973c168d703bc" +checksum = "927f708dd457ed63420400ee5f06945df9632d5d101851952056840426a10dc5" dependencies = [ "alloy-chains", "alloy-consensus", @@ -345,7 +351,7 @@ dependencies = [ "alloy-json-rpc", "alloy-network", "alloy-network-primitives", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-pubsub", "alloy-rpc-client", "alloy-rpc-types-admin", @@ -357,7 +363,7 @@ dependencies = [ "async-stream", "async-trait", "auto_impl", - "dashmap 6.0.1", + "dashmap 6.1.0", "futures", "futures-utils-wasm", "lru", @@ -365,7 +371,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "url", @@ -373,12 +379,12 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c59e13200322138fe4279b4676b0d78c4f55502de127f5a448495d3ddfaa43" +checksum = "2d05f63677e210d758cd5d6d1ce10f20c980c3560ccfbe79ba1997791862a04f" dependencies = [ "alloy-json-rpc", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-transport", "bimap", "futures", @@ -386,15 +392,15 @@ dependencies = [ "serde_json", "tokio", "tokio-stream", - "tower", + "tower 0.5.1", "tracing", ] [[package]] name = "alloy-rlp" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" +checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -403,23 +409,23 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" +checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "alloy-rpc-client" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed31cdba2b23d71c555505b06674f8e7459496abfd7f4875d268434ef5a99ee6" +checksum = "7d82952dca71173813d4e5733e2c986d8b04aea9e0f3b0a576664c232ad050a5" dependencies = [ "alloy-json-rpc", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-pubsub", "alloy-transport", "alloy-transport-http", @@ -431,16 +437,16 @@ dependencies = [ "serde_json", "tokio", "tokio-stream", - "tower", + "tower 0.5.1", "tracing", "url", ] [[package]] name = "alloy-rpc-types" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d758f65aa648491c6358335c578de45cd7de6fdf2877c3cef61f2c9bebea21" +checksum = "64333d639f2a0cf73491813c629a405744e16343a4bc5640931be707c345ecc5" dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", @@ -450,89 +456,90 @@ dependencies = [ [[package]] name = "alloy-rpc-types-admin" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e41c33bbddaec71ca1bd7a4df38f95f408ef4fa3b3c29a7e9cc8d0e43be5fbe" +checksum = "fefd12e99dd6b7de387ed13ad047ce2c90d8950ca62fc48b8a457ebb8f936c61" dependencies = [ "alloy-genesis", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "serde", "serde_json", ] [[package]] name = "alloy-rpc-types-anvil" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa5ee4ffe3e687a6372dd02e998f4f65e512ffdfe0d2c248db822649814c36cd" +checksum = "d25cb45ad7c0930dd62eecf164d2afe4c3d2dd2c82af85680ad1f118e1e5cb83" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-serde", "serde", ] [[package]] name = "alloy-rpc-types-beacon" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3173bf0239a59d3616f4f4ab1682de25dd30b13fb8f52bf7ee7503729354f3c4" +checksum = "2e7081d2206dca51ce23a06338d78d9b536931cc3f15134fc1c6535eb2b77f18" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rpc-types-engine", "serde", "serde_with", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "alloy-rpc-types-engine" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e800d959606fa19b36b31d7c24d68ef75b970c654b7aa581dce23de82db0a5" +checksum = "1464c4dd646e1bdfde86ae65ce5ba168dbb29180b478011fe87117ae46b1629b" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", - "alloy-rpc-types-eth", "alloy-serde", + "derive_more 1.0.0", "jsonrpsee-types", "jsonwebtoken", "rand 0.8.5", "serde", - "thiserror", ] [[package]] name = "alloy-rpc-types-eth" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ba05d6ee4db0d89113294a614137940f79abfc2c40a9a3bee2995660358776" +checksum = "83aa984386deda02482660aa31cb8ca1e63d533f1c31a52d7d181ac5ec68e9b8" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-network-primitives", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "alloy-serde", "alloy-sol-types", "arbitrary", + "cfg-if", + "derive_more 1.0.0", + "hashbrown 0.14.5", "itertools 0.13.0", "jsonrpsee-types", "serde", "serde_json", - "thiserror", ] [[package]] name = "alloy-rpc-types-mev" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a0b28949d1077826684b5912fe9ab1c752a863af0419b1ba9abff19006d61b1" +checksum = "922d92389e5022650c4c60ffd2f9b2467c3f853764f0f74ff16a23106f9017d5" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-serde", "serde", "serde_json", @@ -540,25 +547,25 @@ dependencies = [ [[package]] name = "alloy-rpc-types-trace" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd2af822ed58f2b6dd7cfccf88bf69f42c9a8cbf4663316227646a8a3e5a591f" +checksum = "98db35cd42c90b484377e6bc44d95377a7a38a5ebee996e67754ac0446d542ab" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rpc-types-eth", "alloy-serde", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "alloy-rpc-types-txpool" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a8fbdf39e93a9b213df39541be51671e93e6e8b142c3602ddb4ff6219a1bc85" +checksum = "6bac37082c3b21283b3faf5cc0e08974272aee2f756ce1adeb26db56a5fce0d5" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rpc-types-eth", "alloy-serde", "serde", @@ -566,11 +573,11 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfd260ede54f0b53761fdd04133acc10ae70427f66a69aa9590529bbd066cd58" +checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "arbitrary", "serde", "serde_json", @@ -578,91 +585,91 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5193ee6b370b89db154d7dc40c6a8e6ce11213865baaf2b418a9f2006be762" +checksum = "307324cca94354cd654d6713629f0383ec037e1ff9e3e3d547212471209860c0" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "async-trait", "auto_impl", "elliptic-curve", "k256", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "alloy-signer-local" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf6b19bbb231c7f941af07f363d4c74d356dfcdfcd7dfa85a41a504ae856a6d5" +checksum = "9fabe917ab1778e760b4701628d1cae8e028ee9d52ac6307de4e1e9286ab6b5f" dependencies = [ "alloy-consensus", "alloy-network", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-signer", "async-trait", "coins-bip32", "coins-bip39", "k256", "rand 0.8.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "alloy-sol-macro" -version = "0.8.7" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "661c516eb1fa3294cc7f2fb8955b3b609d639c282ac81a4eedb14d3046db503a" +checksum = "3bfd7853b65a2b4f49629ec975fee274faf6dff15ab8894c620943398ef283c0" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.7" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecbabb8fc3d75a0c2cea5215be22e7a267e3efde835b0f2a8922f5e3f5d47683" +checksum = "82ec42f342d9a9261699f8078e57a7a4fda8aaa73c1a212ed3987080e6a9cd13" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", "const-hex", - "heck 0.5.0", - "indexmap 2.6.0", + "heck", + "indexmap 2.7.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.7" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16517f2af03064485150d89746b8ffdcdbc9b6eeb3d536fb66efd7c2846fbc75" +checksum = "ed2c50e6a62ee2b4f7ab3c6d0366e5770a21cad426e109c2f40335a1b3aff3df" dependencies = [ "alloy-json-abi", "const-hex", "dunce", - "heck 0.5.0", + "heck", "proc-macro2", "quote", "serde_json", - "syn 2.0.76", + "syn 2.0.90", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.7" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07ebb0c1674ff8cbb08378d7c2e0e27919d2a2dae07ad3bca26174deda8d389" +checksum = "ac17c6e89a50fb4a758012e4b409d9a0ba575228e69b539fe37d7a1bd507ca4a" dependencies = [ "serde", "winnow", @@ -670,12 +677,12 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.7" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e448d879903624863f608c552d10efb0e0905ddbee98b0049412799911eb062" +checksum = "c9dc0fffe397aa17628160e16b89f704098bf3c9d74d5d369ebc239575936de5" dependencies = [ "alloy-json-abi", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-sol-macro", "const-hex", "serde", @@ -683,9 +690,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "454220c714857cf68af87d788d1f0638ad8766268b94f6a49fed96cbc2ab382c" +checksum = "33616b2edf7454302a1d48084db185e52c309f73f6c10be99b0fe39354b3f1e9" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -693,33 +700,33 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", - "tower", + "tower 0.5.1", "tracing", "url", ] [[package]] name = "alloy-transport-http" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "377f2353d7fea03a2dba6b9ffbb7d610402c040dd5700d1fae8b9ec2673eed9b" +checksum = "a944f5310c690b62bbb3e7e5ce34527cbd36b2d18532a797af123271ce595a49" dependencies = [ "alloy-json-rpc", "alloy-transport", "reqwest", "serde_json", - "tower", + "tower 0.5.1", "tracing", "url", ] [[package]] name = "alloy-transport-ipc" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8653c47dcc30326fb09a34140e8800fa21987fc52453de6cfcdd5c7b8b6e9886" +checksum = "09fd8491249f74d16ec979b1f5672377b12ebb818e6056478ffa386954dbd350" dependencies = [ "alloy-json-rpc", "alloy-pubsub", @@ -736,9 +743,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "0.3.0" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d43ba8e9a3a7fef626d5fd93cc87ff2d6d2c81acfb866f068b3dce31dda060" +checksum = "a9704761f6297fe482276bee7f77a93cb42bd541c2bd6c1c560b6f3a9ece672e" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -754,11 +761,11 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.5.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd491aade72a82d51db430379f48a44a1d388ff03711a2023f1faa302c5b675d" +checksum = "0a46c9c4fdccda7982e7928904bd85fe235a0404ee3d7e197fff13d61eac8b4f" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "arbitrary", "derive_arbitrary", @@ -795,9 +802,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -810,43 +817,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "aquamarine" @@ -859,14 +866,14 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -905,7 +912,7 @@ dependencies = [ "num-bigint", "num-traits", "paste", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "zeroize", ] @@ -997,9 +1004,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -1032,9 +1039,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.12" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec134f64e2bc57411226dfc4e52dec859ddfc7e711fc5e07b612584f000e4aa" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" dependencies = [ "brotli", "flate2", @@ -1062,9 +1069,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -1073,24 +1080,24 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1101,7 +1108,7 @@ checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" dependencies = [ "futures", "pharos", - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] @@ -1128,14 +1135,14 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backon" @@ -1143,7 +1150,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d67782c3f868daa71d3533538e98a8e13713231969def7536e8039606fc46bf0" dependencies = [ - "fastrand 2.1.1", + "fastrand 2.2.0", "futures-core", "pin-project", "tokio", @@ -1151,17 +1158,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -1223,9 +1230,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.4" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ "bitflags 2.6.0", "cexpr", @@ -1238,14 +1245,32 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.76", + "syn 2.0.90", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.90", ] [[package]] name = "binout" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60b1af88a588fca5fe424ae7d735bc52814f80ff57614f57043cc4e2024f2ea" +checksum = "581d67184175e0c94926cb5e82df97bb6e0d8261d27a88a6ead80994ee73a4ac" [[package]] name = "bit-set" @@ -1280,9 +1305,9 @@ dependencies = [ [[package]] name = "bitm" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06e8e5bec3490b9f6f3adbb78aa4f53e8396fd9994e8a62a346b44ea7c15f35" +checksum = "e7edec3daafc233e78a219c85a77bcf535ee267b0fae7a1aad96bd1a67add5d3" dependencies = [ "dyn_size_of", ] @@ -1341,23 +1366,23 @@ dependencies = [ [[package]] name = "boa_ast" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49637e7ecb7c541c46c3e885d4c49326ad8076dbfb88bef2cf3165d8ea7df2b" +checksum = "3a69ee3a749ea36d4e56d92941e7b25076b493d4917c3d155b6cf369e23547d9" dependencies = [ "bitflags 2.6.0", "boa_interner", "boa_macros", - "indexmap 2.6.0", + "indexmap 2.7.0", "num-bigint", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", ] [[package]] name = "boa_engine" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411558b4cbc7d0303012e26721815e612fed78179313888fd5dd8d6c50d70099" +checksum = "06e4559b35b80ceb2e6328481c0eca9a24506663ea33ee1e279be6b5b618b25c" dependencies = [ "arrayvec", "bitflags 2.6.0", @@ -1374,7 +1399,7 @@ dependencies = [ "fast-float", "hashbrown 0.14.5", "icu_normalizer", - "indexmap 2.6.0", + "indexmap 2.7.0", "intrusive-collections", "itertools 0.13.0", "num-bigint", @@ -1386,7 +1411,7 @@ dependencies = [ "portable-atomic", "rand 0.8.5", "regress", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "ryu-js", "serde", "serde_json", @@ -1394,15 +1419,15 @@ dependencies = [ "static_assertions", "tap", "thin-vec", - "thiserror", + "thiserror 1.0.69", "time", ] [[package]] name = "boa_gc" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eff345a85a39cf9b8ed863198947d61e6df2b1d774002b57341158b0ce2c525" +checksum = "716406f57d67bc3ac7fd227d5513b42df401dff14a3be22cbd8ee29817225363" dependencies = [ "boa_macros", "boa_profiler", @@ -1413,37 +1438,37 @@ dependencies = [ [[package]] name = "boa_interner" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b779280420804c70da9043d152c84eb96e2f7c9e7d1ec3262decf59f9349df" +checksum = "4e18df2272616e1ba0322a69333d37dbb78797f1aa0595aad9dc41e8ecd06ad9" dependencies = [ "boa_gc", "boa_macros", "hashbrown 0.14.5", - "indexmap 2.6.0", + "indexmap 2.7.0", "once_cell", "phf", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "static_assertions", ] [[package]] name = "boa_macros" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e0097fa69cde4c95f9869654004340fbbe2bcf3ce9189ba2a31a65ac40e0a1" +checksum = "240f4126219a83519bad05c9a40bfc0303921eeb571fc2d7e44c17ffac99d3f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", "synstructure", ] [[package]] name = "boa_parser" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd63fe8faf62561fc8c50f9402687e8cfde720b57d292fb3b4ac17c821878ac1" +checksum = "62b59dc05bf1dc019b11478a92986f590cff43fced4d20e866eefb913493e91c" dependencies = [ "bitflags 2.6.0", "boa_ast", @@ -1455,24 +1480,24 @@ dependencies = [ "num-bigint", "num-traits", "regress", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", ] [[package]] name = "boa_profiler" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9da895f0df9e2a97b36c1f98e0c5d2ab963abc8679d80f2a66f7bcb211ce90" +checksum = "00ee0645509b3b91abd724f25072649d9e8e65653a78ff0b6e592788a58dd838" [[package]] name = "boa_string" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ca6668df83fcd3c2903f6f296b7180421908c5b478ebe0d1c468be9fd60e1c" +checksum = "ae85205289bab1f2c7c8a30ddf0541cf89ba2ff7dbd144feef50bbfa664288d4" dependencies = [ "fast-float", "paste", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "sptr", "static_assertions", ] @@ -1488,9 +1513,9 @@ dependencies = [ [[package]] name = "brotli" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -1519,12 +1544,12 @@ dependencies = [ [[package]] name = "bstr" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +checksum = "1a68f1f47cdf0ec8ee4b941b2eee2a80cb796db73118c0dd09ac63fbe405be22" dependencies = [ "memchr", - "regex-automata 0.4.7", + "regex-automata 0.4.9", "serde", ] @@ -1542,22 +1567,22 @@ checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] name = "bytemuck" -version = "1.17.1" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -1568,9 +1593,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] @@ -1601,9 +1626,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ "serde", ] @@ -1619,7 +1644,7 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1645,9 +1670,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.15" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b6a275aa2903740dc87da01c62040406b8812552e97129a63ea8850a17c6e6" +checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" dependencies = [ "jobserver", "libc", @@ -1675,6 +1700,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.38" @@ -1740,9 +1771,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.16" +version = "4.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" +checksum = "69371e34337c4c984bbe322360c2547210bf632eb2814bbe78a6e87a2935bd2b" dependencies = [ "clap_builder", "clap_derive", @@ -1750,9 +1781,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.15" +version = "4.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" +checksum = "6e24c1b4099818523236a8ca881d2b45db98dadfb4625cf6608c12069fcbbde1" dependencies = [ "anstream", "anstyle", @@ -1762,21 +1793,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "coins-bip32" @@ -1791,7 +1822,7 @@ dependencies = [ "k256", "serde", "sha2 0.10.8", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1807,7 +1838,7 @@ dependencies = [ "pbkdf2", "rand 0.8.5", "sha2 0.10.8", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1826,14 +1857,14 @@ dependencies = [ "serde", "sha2 0.10.8", "sha3", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "combine" @@ -1847,14 +1878,14 @@ dependencies = [ [[package]] name = "comfy-table" -version = "7.1.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b34115915337defe99b2aff5c2ce6771e5fbc4079f4b506301f5cf394c8452f7" +checksum = "24f165e7b643266ea80cb858aed492ad9280e3e05ce24d4a99d7d7b889b6a4d9" dependencies = [ - "crossterm", + "crossterm 0.28.1", "strum", "strum_macros", - "unicode-width", + "unicode-width 0.2.0", ] [[package]] @@ -1902,9 +1933,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" dependencies = [ "cfg-if", "cpufeatures", @@ -1921,9 +1952,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_format" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673" +checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" dependencies = [ "const_format_proc_macros", "konst", @@ -1931,9 +1962,9 @@ dependencies = [ [[package]] name = "const_format_proc_macros" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500" +checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" dependencies = [ "proc-macro2", "quote", @@ -1965,6 +1996,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -1982,18 +2023,18 @@ dependencies = [ [[package]] name = "cpp_demangle" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" +checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" dependencies = [ "cfg-if", ] [[package]] name = "cpufeatures" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -2110,6 +2151,19 @@ dependencies = [ "winapi", ] +[[package]] +name = "crossterm" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +dependencies = [ + "bitflags 2.6.0", + "crossterm_winapi", + "parking_lot 0.12.3", + "rustix", + "winapi", +] + [[package]] name = "crossterm_winapi" version = "0.9.1" @@ -2160,9 +2214,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" dependencies = [ "csv-core", "itoa", @@ -2213,7 +2267,7 @@ dependencies = [ "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "subtle", "zeroize", ] @@ -2226,7 +2280,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -2250,7 +2304,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -2261,7 +2315,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -2279,9 +2333,9 @@ dependencies = [ [[package]] name = "dashmap" -version = "6.0.1" +version = "6.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804c8821570c3f8b70230c2ba75ffa5c0f9a4189b9a432b6656c536712acae28" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if", "crossbeam-utils", @@ -2375,13 +2429,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -2393,8 +2447,8 @@ dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", - "rustc_version 0.4.0", - "syn 2.0.76", + "rustc_version 0.4.1", + "syn 2.0.90", ] [[package]] @@ -2415,7 +2469,7 @@ dependencies = [ "convert_case 0.6.0", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", "unicode-xid", ] @@ -2523,7 +2577,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -2552,9 +2606,9 @@ checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "dyn_size_of" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d4f78a40b1ec35bf8cafdaaf607ba2f773c366b0b3bda48937cacd7a8d5134" +checksum = "fdbac012a81cc46ca554aceae23c52f4f55adb343f2f32ca99bb4e5ef868cee2" [[package]] name = "ecdsa" @@ -2610,7 +2664,7 @@ dependencies = [ "reth-stages", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "walkdir", ] @@ -2673,14 +2727,14 @@ dependencies = [ [[package]] name = "enum-as-inner" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -2691,7 +2745,27 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", +] + +[[package]] +name = "equator" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35da53b5a021d2484a7cc49b2ac7f2d840f8236a286f84202369bd338d761ea" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf679796c0322556351f287a51b49e48f7c4986e727b5dd78c972d30e2e16cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] @@ -2702,12 +2776,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2729,7 +2803,7 @@ dependencies = [ "reth-node-ethereum", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2796,7 +2870,7 @@ dependencies = [ "reth-rpc-types", "reth-tracing", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -3034,9 +3108,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "fastrlp" @@ -3056,7 +3130,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e182f7dbc2ef73d9ef67351c5fbbea084729c48362d3ce9dd44c28e32e277fe5" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3101,12 +3175,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] @@ -3144,9 +3218,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -3159,9 +3233,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -3169,15 +3243,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -3186,9 +3260,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -3207,26 +3281,26 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -3240,9 +3314,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -3309,9 +3383,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -3334,7 +3408,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -3424,7 +3498,7 @@ dependencies = [ "revm", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -3432,9 +3506,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" dependencies = [ "atomic-waker", "bytes", @@ -3442,7 +3516,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -3490,10 +3564,12 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ + "allocator-api2", + "equivalent", "foldhash", "serde", ] @@ -3517,12 +3593,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -3608,9 +3678,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -3642,9 +3712,9 @@ dependencies = [ [[package]] name = "http-range-header" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" [[package]] name = "http-types" @@ -3668,9 +3738,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -3702,9 +3772,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", @@ -3723,9 +3793,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http", @@ -3733,7 +3803,7 @@ dependencies = [ "hyper-util", "log", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", "tokio-rustls", @@ -3743,9 +3813,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -3754,9 +3824,8 @@ dependencies = [ "http-body", "hyper", "pin-project-lite", - "socket2 0.5.7", + "socket2 0.5.8", "tokio", - "tower", "tower-service", "tracing", ] @@ -3781,7 +3850,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -3795,9 +3864,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -3931,7 +4000,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -3952,12 +4021,23 @@ dependencies = [ [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -3971,13 +4051,13 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", ] [[package]] @@ -4018,13 +4098,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "arbitrary", "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "serde", ] @@ -4041,7 +4121,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ "ahash", - "indexmap 2.6.0", + "indexmap 2.7.0", "is-terminal", "itoa", "log", @@ -4073,9 +4153,9 @@ dependencies = [ [[package]] name = "interprocess" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f4e4a06d42fab3e85ab1b419ad32b09eab58b901d40c57935ff92db3287a13" +checksum = "894148491d817cb36b6f778017b8ac46b17408d522dd90f539d677ea938362eb" dependencies = [ "doctest-file", "futures-core", @@ -4088,9 +4168,9 @@ dependencies = [ [[package]] name = "intrusive-collections" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b694dc9f70c3bda874626d2aed13b780f137aab435f4e9814121955cf706122e" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" dependencies = [ "memoffset", ] @@ -4101,7 +4181,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.7", + "socket2 0.5.8", "widestring", "windows-sys 0.48.0", "winreg", @@ -4109,15 +4189,15 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "iri-string" -version = "0.7.2" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f5f6c2df22c009ac44f6f1499308e7a3ac7ba42cd2378475cc691510e1eef1b" +checksum = "dc0f0a572e8ffe56e2ff4f769f32ffe919282c3916799f8b68688b6030063bea" dependencies = [ "memchr", "serde", @@ -4169,9 +4249,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jni" @@ -4183,7 +4263,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror", + "thiserror 1.0.69", "walkdir", ] @@ -4204,18 +4284,19 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "a865e038f7f6ed956f788f0d7d60c541fff74c7bd74272c5d4cf15c63743e705" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "jsonrpsee" -version = "0.24.3" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec465b607a36dc5dd45d48b7689bc83f679f66a3ac6b6b21cc787a11e0f8685" +checksum = "c5c71d8c1a731cc4227c2f698d377e7848ca12c8a48866fc5e6951c43a4db843" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -4231,9 +4312,9 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.24.3" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f0977f9c15694371b8024c35ab58ca043dbbf4b51ccb03db8858a021241df1" +checksum = "548125b159ba1314104f5bb5f38519e03a41862786aa3925cf349aae9cdd546e" dependencies = [ "base64 0.22.1", "futures-channel", @@ -4246,7 +4327,7 @@ dependencies = [ "rustls-pki-types", "rustls-platform-verifier", "soketto", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-rustls", "tokio-util", @@ -4256,9 +4337,9 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.24.3" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e942c55635fbf5dc421938b8558a8141c7e773720640f4f1dbe1f4164ca4e221" +checksum = "f2882f6f8acb9fdaec7cefc4fd607119a9bd709831df7d7672a1d3b644628280" dependencies = [ "async-trait", "bytes", @@ -4271,10 +4352,10 @@ dependencies = [ "parking_lot 0.12.3", "pin-project", "rand 0.8.5", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -4283,9 +4364,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.24.3" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33774602df12b68a2310b38a535733c477ca4a498751739f89fe8dbbb62ec4c" +checksum = "b3638bc4617f96675973253b3a45006933bde93c2fd8a6170b33c777cc389e5b" dependencies = [ "async-trait", "base64 0.22.1", @@ -4299,31 +4380,31 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", - "tower", + "tower 0.4.13", "tracing", "url", ] [[package]] name = "jsonrpsee-proc-macros" -version = "0.24.3" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b07a2daf52077ab1b197aea69a5c990c060143835bf04c77070e98903791715" +checksum = "c06c01ae0007548e73412c08e2285ffe5d723195bf268bce67b1b77c3bb2a14d" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "jsonrpsee-server" -version = "0.24.3" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038fb697a709bec7134e9ccbdbecfea0e2d15183f7140254afef7c5610a3f488" +checksum = "82ad8ddc14be1d4290cd68046e7d1d37acd408efed6d3ca08aefcc3ad6da069c" dependencies = [ "futures-util", "http", @@ -4338,31 +4419,31 @@ dependencies = [ "serde", "serde_json", "soketto", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", - "tower", + "tower 0.4.13", "tracing", ] [[package]] name = "jsonrpsee-types" -version = "0.24.3" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b67d6e008164f027afbc2e7bb79662650158d26df200040282d2aa1cbb093b" +checksum = "a178c60086f24cc35bb82f57c651d0d25d99c4742b4d335de04e97fa1f08a8a1" dependencies = [ "http", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "jsonrpsee-wasm-client" -version = "0.24.3" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0470d0ae043ffcb0cd323797a631e637fb4b55fe3eaa6002934819458bba62a7" +checksum = "1a01cd500915d24ab28ca17527e23901ef1be6d659a2322451e1045532516c25" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -4371,9 +4452,9 @@ dependencies = [ [[package]] name = "jsonrpsee-ws-client" -version = "0.24.3" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "992bf67d1132f88edf4a4f8cff474cf01abb2be203004a2b8e11c2b20795b99e" +checksum = "0fe322e0896d0955a3ebdd5bf813571c53fea29edd713bc315b76620b327e86d" dependencies = [ "http", "jsonrpsee-client-transport", @@ -4399,9 +4480,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", @@ -4422,9 +4503,9 @@ dependencies = [ [[package]] name = "keccak-asm" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422fbc7ff2f2f5bdffeb07718e5a5324dca72b0c9293d50df4026652385e3314" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" dependencies = [ "digest 0.10.7", "sha3-asm", @@ -4462,15 +4543,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.167" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -4478,15 +4559,15 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libp2p-identity" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cca1eb2bc1fd29f099f3daaab7effd01e1a54b7c577d0ed082521034d912e8" +checksum = "257b5621d159b32282eac446bed6670c39c7dc68a200a992d8f056afa0066f6d" dependencies = [ "asn1_der", "bs58", @@ -4496,18 +4577,18 @@ dependencies = [ "multihash", "quick-protobuf", "sha2 0.10.8", - "thiserror", + "thiserror 1.0.69", "tracing", "zeroize", ] [[package]] name = "libproc" -version = "0.14.8" +version = "0.14.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae9ea4b75e1a81675429dafe43441df1caea70081e82246a8cccf514884a88bb" +checksum = "e78a09b56be5adbcad5aa1197371688dc6bb249a26da3bca2011ee2fb987ebfb" dependencies = [ - "bindgen", + "bindgen 0.70.1", "errno", "libc", ] @@ -4593,9 +4674,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "lock_api" @@ -4615,11 +4696,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] @@ -4669,9 +4750,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] @@ -4695,6 +4776,16 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "metrics" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a7deb012b3b2767169ff203fadb4c6b0b82b947512e5eb9e0b78c2e186ad9e3" +dependencies = [ + "ahash", + "portable-atomic", +] + [[package]] name = "metrics-exporter-prometheus" version = "0.15.3" @@ -4702,26 +4793,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4f0c8427b39666bf970460908b213ec09b3b350f20c0c2eabcbba51704a08e6" dependencies = [ "base64 0.22.1", - "indexmap 2.6.0", - "metrics", + "indexmap 2.7.0", + "metrics 0.23.0", "metrics-util", "quanta", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "metrics-process" -version = "2.1.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb524e5438255eaa8aa74214d5a62713b77b2c3c6e3c0bbeee65cfd9a58948ba" +checksum = "4a82c8add4382f29a122fa64fff1891453ed0f6b2867d971e7d60cb8dfa322ff" dependencies = [ + "libc", "libproc", "mach2", - "metrics", + "metrics 0.24.1", "once_cell", - "procfs", + "procfs 0.17.0", "rlimit", - "windows 0.57.0", + "windows 0.58.0", ] [[package]] @@ -4734,8 +4826,8 @@ dependencies = [ "crossbeam-epoch", "crossbeam-utils", "hashbrown 0.14.5", - "indexmap 2.6.0", - "metrics", + "indexmap 2.7.0", + "metrics 0.23.0", "num_cpus", "ordered-float", "quanta", @@ -4758,7 +4850,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -4785,15 +4877,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - [[package]] name = "miniz_oxide" version = "0.8.0" @@ -4817,11 +4900,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", @@ -4851,7 +4933,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -4883,9 +4965,9 @@ checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" [[package]] name = "multiaddr" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b852bc02a2da5feed68cd14fa50d0774b92790a5bdbfa932a813926c8472070" +checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961" dependencies = [ "arrayref", "byteorder", @@ -4913,9 +4995,9 @@ dependencies = [ [[package]] name = "multihash" -version = "0.19.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" +checksum = "cc41f430805af9d1cf4adae4ed2149c759b877b01d909a1f40256188d09345d2" dependencies = [ "core2", "unsigned-varint", @@ -4960,16 +5042,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - [[package]] name = "num" version = "0.4.3" @@ -5089,7 +5161,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -5117,18 +5189,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.3" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oorandom" @@ -5138,44 +5210,78 @@ checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "op-alloy-consensus" -version = "0.2.2" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0db6e3a9bbbcef7cef19d77aa2cc76d61377376e3bb86f89167e7e3f30ea023" +checksum = "21aad1fbf80d2bcd7406880efc7ba109365f44bbb72896758ddcbfa46bf1592c" dependencies = [ "alloy-consensus", "alloy-eips", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "alloy-serde", "derive_more 1.0.0", "serde", + "spin", +] + +[[package]] +name = "op-alloy-genesis" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1b8a9b70da0e027242ec1762f0f3a386278b6291d00d12ff5a64929dc19f68" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives 0.8.14", + "alloy-sol-types", + "serde", + "serde_repr", ] [[package]] name = "op-alloy-network" -version = "0.2.2" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66184e6c92269ba4ef1f80e8566ce11d41b584884ce7476d4b1b5e0e38503ecb" +checksum = "783ce4ebc0a994eee2188431511b16692b704e1e8fff0c77d8c0354d3c2b1fc8" dependencies = [ "alloy-consensus", - "alloy-eips", "alloy-network", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rpc-types-eth", "op-alloy-consensus", "op-alloy-rpc-types", ] +[[package]] +name = "op-alloy-protocol" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf300a82ae2d30e2255bfea87a2259da49f63a25a44db561ae64cc9e3084139f" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives 0.8.14", + "alloy-rlp", + "alloy-serde", + "hashbrown 0.14.5", + "op-alloy-consensus", + "op-alloy-genesis", + "serde", +] + [[package]] name = "op-alloy-rpc-types" -version = "0.2.2" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c604cd3b9680d0edd0b7127f3550bcff634c2d2efe27b2b4853e72320186a8" +checksum = "e281fbfc2198b7c0c16457d6524f83d192662bc9f3df70f24c3038d4521616df" dependencies = [ - "alloy-network", - "alloy-primitives 0.8.7", + "alloy-eips", + "alloy-network-primitives", + "alloy-primitives 0.8.14", "alloy-rpc-types-eth", "alloy-serde", + "cfg-if", + "hashbrown 0.14.5", "op-alloy-consensus", "serde", "serde_json", @@ -5183,13 +5289,18 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types-engine" -version = "0.2.2" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "620e645c36cc66220909bf97e6632e7a154a2309356221cbf33ae78bf5294478" +checksum = "2947272a81ebf988f4804b6f0f6a7c0b2f6f89a908cb410e36f8f3828f81c778" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-eips", + "alloy-primitives 0.8.14", "alloy-rpc-types-engine", "alloy-serde", + "derive_more 1.0.0", + "op-alloy-consensus", + "op-alloy-genesis", + "op-alloy-protocol", "serde", ] @@ -5213,19 +5324,13 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "ordered-float" -version = "4.2.2" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a91171844676f8c7990ce64959210cd2eaef32c2612c50f9fae9f8aaa6065a6" +checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" dependencies = [ "num-traits", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "p256" version = "0.13.2" @@ -5277,9 +5382,9 @@ dependencies = [ [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -5324,7 +5429,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall 0.5.7", "smallvec", "windows-targets 0.52.6", ] @@ -5363,26 +5468,27 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.11" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd53dff83f26735fdc1ca837098ccf133605d794cdae66acfc2bfac3ec809d95" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.69", "ucd-trie", ] [[package]] name = "ph" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b7b74d575d7c11fb653fae69688be5206cafc1ead33c01ce61ac7f36eae45b" +checksum = "b2fbaf8da280599aae4047ea0659a1e79cf61739bce5bdc50ca88dc7e6357060" dependencies = [ + "aligned-vec", "binout", "bitm", "dyn_size_of", "rayon", - "wyhash", + "seedable_hash", ] [[package]] @@ -5392,7 +5498,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" dependencies = [ "futures", - "rustc_version 0.4.0", + "rustc_version 0.4.1", ] [[package]] @@ -5425,7 +5531,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -5439,29 +5545,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -5481,9 +5587,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "plain_hasher" @@ -5496,9 +5602,9 @@ dependencies = [ [[package]] name = "plotters" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" dependencies = [ "num-traits", "plotters-backend", @@ -5509,15 +5615,15 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" [[package]] name = "plotters-svg" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" dependencies = [ "plotters-backend", ] @@ -5542,9 +5648,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.7.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da544ee218f0d287a911e9c99a39a8c9bc8fcad3cb8db5959940044ecfc67265" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "powerfmt" @@ -5571,7 +5677,7 @@ dependencies = [ "smallvec", "symbolic-demangle", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5611,12 +5717,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.22" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -5691,14 +5797,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -5714,7 +5820,19 @@ dependencies = [ "flate2", "hex", "lazy_static", - "procfs-core", + "procfs-core 0.16.0", + "rustix", +] + +[[package]] +name = "procfs" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc5b72d8145275d844d4b5f6d4e1eef00c8cd889edb6035c21675d1bb1f45c9f" +dependencies = [ + "bitflags 2.6.0", + "hex", + "procfs-core 0.17.0", "rustix", ] @@ -5729,6 +5847,16 @@ dependencies = [ "hex", ] +[[package]] +name = "procfs-core" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "239df02d8349b06fc07398a3a1697b06418223b1c7725085e801e7c0fc6a12ec" +dependencies = [ + "bitflags 2.6.0", + "hex", +] + [[package]] name = "proptest" version = "1.5.0" @@ -5743,7 +5871,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -5767,7 +5895,7 @@ checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -5811,50 +5939,54 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b22d8e7369034b9a7132bc2008cac12f2013c8132b45e0554e6e20e2617f2156" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "rustls", - "socket2 0.5.7", - "thiserror", + "socket2 0.5.8", + "thiserror 2.0.4", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.6" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba92fb39ec7ad06ca2582c0ca834dfeadcaf06ddfc8e635c80aa7e1c05315fdd" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom 0.2.15", "rand 0.8.5", "ring", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "rustls", + "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.4", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", - "socket2 0.5.7", + "socket2 0.5.8", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5972,7 +6104,7 @@ dependencies = [ "bitflags 2.6.0", "cassowary", "compact_str", - "crossterm", + "crossterm 0.27.0", "itertools 0.13.0", "lru", "paste", @@ -5981,14 +6113,14 @@ dependencies = [ "strum_macros", "unicode-segmentation", "unicode-truncate", - "unicode-width", + "unicode-width 0.1.14", ] [[package]] name = "raw-cpuid" -version = "11.1.0" +version = "11.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d" +checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" dependencies = [ "bitflags 2.6.0", ] @@ -6030,9 +6162,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -6045,19 +6177,19 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.15", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -6071,13 +6203,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -6088,15 +6220,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "regress" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16fe0a24af5daaae947294213d2fd2646fbf5e1fbacc1d4ba3e84b2393854842" +checksum = "1541daf4e4ed43a0922b7969bdc2170178bcacc5dabf7e39bc508a9fa3953a7a" dependencies = [ "hashbrown 0.14.5", "memchr", @@ -6104,9 +6236,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -6127,13 +6259,13 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.8.1", "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.2", "tokio", "tokio-rustls", "tokio-util", @@ -6276,7 +6408,7 @@ dependencies = [ "alloy-rlp", "futures-core", "futures-util", - "metrics", + "metrics 0.23.0", "reth-chainspec", "reth-metrics", "reth-payload-builder", @@ -6299,7 +6431,7 @@ dependencies = [ "assert_matches", "futures", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "reth-blockchain-tree", "reth-blockchain-tree-api", "reth-chainspec", @@ -6334,7 +6466,7 @@ dependencies = [ "reth-tokio-util", "reth-tracing", "schnellru", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -6373,11 +6505,11 @@ dependencies = [ "reth-tracing", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tikv-jemallocator", "tokio", "tokio-util", - "tower", + "tower 0.4.13", "tracing", ] @@ -6389,7 +6521,7 @@ dependencies = [ "aquamarine", "assert_matches", "linked_hash_set", - "metrics", + "metrics 0.23.0", "parking_lot 0.12.3", "reth-blockchain-tree-api", "reth-chainspec", @@ -6424,7 +6556,7 @@ dependencies = [ "reth-execution-errors", "reth-primitives", "reth-storage-errors", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6435,7 +6567,7 @@ dependencies = [ "alloy-signer-local", "auto_impl", "derive_more 1.0.0", - "metrics", + "metrics 0.23.0", "parking_lot 0.12.3", "pin-project", "rand 0.8.5", @@ -6459,7 +6591,7 @@ dependencies = [ "alloy-chains", "alloy-eips", "alloy-genesis", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "alloy-trie", "auto_impl", @@ -6492,7 +6624,7 @@ dependencies = [ "backon", "clap", "comfy-table", - "crossterm", + "crossterm 0.27.0", "eyre", "fdlimit", "futures", @@ -6554,13 +6686,13 @@ name = "reth-cli-util" version = "1.0.6" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "eyre", "libc", "rand 0.8.5", "reth-fs-util", "secp256k1", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6570,7 +6702,7 @@ dependencies = [ "alloy-consensus", "alloy-eips", "alloy-genesis", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-trie", "arbitrary", "bytes", @@ -6591,7 +6723,7 @@ dependencies = [ "proc-macro2", "quote", "similar-asserts", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -6663,7 +6795,7 @@ dependencies = [ "derive_more 1.0.0", "eyre", "iai-callgrind", - "metrics", + "metrics 0.23.0", "page_size", "paste", "pprof", @@ -6681,14 +6813,14 @@ dependencies = [ "reth-storage-errors", "reth-tracing", "reth-trie-common", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "serde", "serde_json", "strum", "sysinfo", "tempfile", "test-fuzz", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6701,7 +6833,7 @@ dependencies = [ "criterion", "derive_more 1.0.0", "iai-callgrind", - "metrics", + "metrics 0.23.0", "modular-bitfield", "parity-scale-codec", "pprof", @@ -6742,7 +6874,7 @@ dependencies = [ "reth-trie-db", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tracing", ] @@ -6765,7 +6897,7 @@ dependencies = [ name = "reth-discv4" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "assert_matches", "discv5", @@ -6781,7 +6913,7 @@ dependencies = [ "schnellru", "secp256k1", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -6791,14 +6923,14 @@ dependencies = [ name = "reth-discv5" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "derive_more 1.0.0", "discv5", "enr", "futures", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "rand 0.8.5", "reth-chainspec", "reth-ethereum-forks", @@ -6806,7 +6938,7 @@ dependencies = [ "reth-network-peers", "reth-tracing", "secp256k1", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -6816,7 +6948,7 @@ name = "reth-dns-discovery" version = "1.0.6" dependencies = [ "alloy-chains", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "data-encoding", "enr", @@ -6832,7 +6964,7 @@ dependencies = [ "secp256k1", "serde", "serde_with", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -6848,7 +6980,7 @@ dependencies = [ "futures", "futures-util", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "pin-project", "rand 0.8.5", "rayon", @@ -6867,7 +6999,7 @@ dependencies = [ "reth-testing-utils", "reth-tracing", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", @@ -6914,7 +7046,7 @@ name = "reth-ecies" version = "1.0.6" dependencies = [ "aes", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "block-padding", "byteorder", @@ -6931,7 +7063,7 @@ dependencies = [ "secp256k1", "sha2 0.10.8", "sha3", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", @@ -6974,7 +7106,7 @@ dependencies = [ "reth-prune-types", "reth-stages-api", "reth-tasks", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -6986,7 +7118,7 @@ dependencies = [ "alloy-rlp", "assert_matches", "futures", - "metrics", + "metrics 0.23.0", "rand 0.8.5", "reth-beacon-consensus", "reth-blockchain-tree", @@ -7019,7 +7151,7 @@ dependencies = [ "reth-tasks", "reth-tracing", "reth-trie", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -7062,7 +7194,7 @@ dependencies = [ "reth-execution-errors", "reth-fs-util", "reth-storage-errors", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7091,7 +7223,7 @@ dependencies = [ "serde", "snap", "test-fuzz", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", @@ -7115,7 +7247,7 @@ dependencies = [ "reth-codecs-derive", "reth-primitives", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7165,7 +7297,7 @@ name = "reth-ethereum-forks" version = "1.0.6" dependencies = [ "alloy-chains", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "arbitrary", "auto_impl", @@ -7174,7 +7306,7 @@ dependencies = [ "once_cell", "proptest", "proptest-derive", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "serde", "thiserror-no-std", ] @@ -7202,7 +7334,7 @@ dependencies = [ name = "reth-etl" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "rayon", "reth-db-api", "tempfile", @@ -7263,7 +7395,7 @@ dependencies = [ "reth-revm", "revm", "revm-primitives", - "thiserror", + "thiserror 1.0.69", "tracing", ] @@ -7272,7 +7404,7 @@ name = "reth-execution-errors" version = "1.0.6" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "derive_more 1.0.0", "nybbles", @@ -7287,7 +7419,7 @@ name = "reth-execution-types" version = "1.0.6" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "reth-chainspec", "reth-execution-errors", "reth-primitives", @@ -7302,7 +7434,7 @@ version = "1.0.6" dependencies = [ "eyre", "futures", - "metrics", + "metrics 0.23.0", "reth-blockchain-tree", "reth-chainspec", "reth-config", @@ -7355,7 +7487,7 @@ dependencies = [ "reth-provider", "reth-tasks", "reth-transaction-pool", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -7363,7 +7495,7 @@ dependencies = [ name = "reth-exex-types" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "reth-provider", "serde", ] @@ -7374,7 +7506,7 @@ version = "1.0.6" dependencies = [ "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -7391,11 +7523,11 @@ dependencies = [ "rand 0.8.5", "reth-tracing", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", - "tower", + "tower 0.4.13", "tracing", ] @@ -7406,16 +7538,16 @@ dependencies = [ "bitflags 2.6.0", "byteorder", "criterion", - "dashmap 6.0.1", + "dashmap 6.1.0", "derive_more 1.0.0", - "indexmap 2.6.0", + "indexmap 2.7.0", "parking_lot 0.12.3", "pprof", "rand 0.8.5", "rand_xorshift", "reth-mdbx-sys", "tempfile", - "thiserror", + "thiserror 1.0.69", "tracing", ] @@ -7423,7 +7555,7 @@ dependencies = [ name = "reth-mdbx-sys" version = "1.0.6" dependencies = [ - "bindgen", + "bindgen 0.69.5", "cc", ] @@ -7432,7 +7564,7 @@ name = "reth-metrics" version = "1.0.6" dependencies = [ "futures", - "metrics", + "metrics 0.23.0", "reth-metrics-derive", "tokio", "tokio-util", @@ -7442,12 +7574,12 @@ dependencies = [ name = "reth-metrics-derive" version = "1.0.6" dependencies = [ - "metrics", + "metrics 0.23.0", "proc-macro2", "quote", "regex", "serial_test", - "syn 2.0.76", + "syn 2.0.90", "trybuild", ] @@ -7455,7 +7587,7 @@ dependencies = [ name = "reth-net-banlist" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", ] [[package]] @@ -7466,7 +7598,7 @@ dependencies = [ "reqwest", "reth-tracing", "serde_with", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -7485,7 +7617,7 @@ dependencies = [ "enr", "futures", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "parking_lot 0.12.3", "pin-project", "pprof", @@ -7512,14 +7644,14 @@ dependencies = [ "reth-tokio-util", "reth-tracing", "reth-transaction-pool", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "schnellru", "secp256k1", "serde", "serial_test", "smallvec", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", @@ -7531,7 +7663,7 @@ dependencies = [ name = "reth-network-api" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rpc-types-admin", "auto_impl", "derive_more 1.0.0", @@ -7544,7 +7676,7 @@ dependencies = [ "reth-network-types", "reth-tokio-util", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", ] @@ -7571,14 +7703,14 @@ dependencies = [ name = "reth-network-peers" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "enr", "rand 0.8.5", "secp256k1", "serde_json", "serde_with", - "thiserror", + "thiserror 1.0.69", "tokio", "url", ] @@ -7612,7 +7744,7 @@ dependencies = [ "serde", "sucds", "tempfile", - "thiserror", + "thiserror 1.0.69", "tracing", "zstd", ] @@ -7750,7 +7882,7 @@ name = "reth-node-ethereum" version = "1.0.6" dependencies = [ "alloy-genesis", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "eyre", "futures", "futures-util", @@ -7808,11 +7940,11 @@ dependencies = [ "eyre", "http", "jsonrpsee", - "metrics", + "metrics 0.23.0", "metrics-exporter-prometheus", "metrics-process", "metrics-util", - "procfs", + "procfs 0.16.0", "reqwest", "reth-chainspec", "reth-db", @@ -7823,7 +7955,7 @@ dependencies = [ "socket2 0.4.10", "tikv-jemalloc-ctl", "tokio", - "tower", + "tower 0.4.13", "tracing", "vergen", ] @@ -7833,7 +7965,7 @@ name = "reth-node-optimism" version = "1.0.6" dependencies = [ "alloy-genesis", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "async-trait", "clap", "eyre", @@ -7872,7 +8004,7 @@ dependencies = [ "reth-transaction-pool", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -7883,7 +8015,7 @@ version = "1.0.6" dependencies = [ "alloy-chains", "alloy-genesis", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "derive_more 1.0.0", "once_cell", "op-alloy-rpc-types", @@ -7897,7 +8029,7 @@ dependencies = [ name = "reth-optimism-cli" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "clap", "eyre", @@ -7965,7 +8097,7 @@ dependencies = [ "reth-trie", "revm", "sha2 0.10.8", - "thiserror", + "thiserror 1.0.69", "tracing", ] @@ -7977,7 +8109,7 @@ version = "1.0.6" name = "reth-optimism-rpc" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "jsonrpsee-types", "op-alloy-network", "parking_lot 0.12.3", @@ -7999,7 +8131,7 @@ dependencies = [ "reth-transaction-pool", "revm", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -8009,7 +8141,7 @@ name = "reth-payload-builder" version = "1.0.6" dependencies = [ "futures-util", - "metrics", + "metrics 0.23.0", "pin-project", "reth-errors", "reth-ethereum-engine-primitives", @@ -8021,7 +8153,7 @@ dependencies = [ "reth-rpc-types", "reth-transaction-pool", "revm", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -8038,7 +8170,7 @@ dependencies = [ "reth-rpc-types", "reth-transaction-pool", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -8059,7 +8191,7 @@ dependencies = [ "alloy-consensus", "alloy-eips", "alloy-genesis", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "alloy-rpc-types", "alloy-serde", @@ -8091,7 +8223,7 @@ dependencies = [ "serde_json", "tempfile", "test-fuzz", - "thiserror", + "thiserror 1.0.69", "zstd", ] @@ -8102,7 +8234,7 @@ dependencies = [ "alloy-consensus", "alloy-eips", "alloy-genesis", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "alloy-rpc-types-eth", "arbitrary", @@ -8128,10 +8260,10 @@ dependencies = [ "alloy-rpc-types-engine", "assert_matches", "auto_impl", - "dashmap 6.0.1", + "dashmap 6.1.0", "eyre", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "once_cell", "parking_lot 0.12.3", "rand 0.8.5", @@ -8168,10 +8300,10 @@ dependencies = [ name = "reth-prune" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "assert_matches", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "rayon", "reth-chainspec", "reth-config", @@ -8187,8 +8319,8 @@ dependencies = [ "reth-testing-utils", "reth-tokio-util", "reth-tracing", - "rustc-hash 2.0.0", - "thiserror", + "rustc-hash 2.1.0", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -8197,7 +8329,7 @@ dependencies = [ name = "reth-prune-types" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "arbitrary", "assert_matches", "bytes", @@ -8209,7 +8341,7 @@ dependencies = [ "serde", "serde_json", "test-fuzz", - "thiserror", + "thiserror 1.0.69", "toml", ] @@ -8236,7 +8368,7 @@ dependencies = [ "alloy-dyn-abi", "alloy-genesis", "alloy-network", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "async-trait", "derive_more 1.0.0", @@ -8279,10 +8411,10 @@ dependencies = [ "secp256k1", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", - "tower", + "tower 0.4.13", "tracing", "tracing-futures", ] @@ -8324,7 +8456,7 @@ dependencies = [ "clap", "http", "jsonrpsee", - "metrics", + "metrics 0.23.0", "pin-project", "reth-beacon-consensus", "reth-chainspec", @@ -8356,9 +8488,9 @@ dependencies = [ "reth-transaction-pool", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", - "tower", + "tower 0.4.13", "tower-http", "tracing", ] @@ -8372,7 +8504,7 @@ dependencies = [ "async-trait", "jsonrpsee-core", "jsonrpsee-types", - "metrics", + "metrics 0.23.0", "reth-beacon-consensus", "reth-chainspec", "reth-engine-primitives", @@ -8391,7 +8523,7 @@ dependencies = [ "reth-testing-utils", "reth-tokio-util", "serde", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -8441,7 +8573,7 @@ dependencies = [ "futures", "jsonrpsee-core", "jsonrpsee-types", - "metrics", + "metrics 0.23.0", "rand 0.8.5", "reth-chain-state", "reth-chainspec", @@ -8464,7 +8596,7 @@ dependencies = [ "schnellru", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -8481,7 +8613,7 @@ dependencies = [ "pin-project", "reqwest", "tokio", - "tower", + "tower 0.4.13", "tracing", ] @@ -8489,7 +8621,7 @@ dependencies = [ name = "reth-rpc-server-types" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "jsonrpsee-core", "jsonrpsee-types", "reth-errors", @@ -8504,7 +8636,7 @@ dependencies = [ name = "reth-rpc-types" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rpc-types", "alloy-rpc-types-admin", "alloy-rpc-types-anvil", @@ -8576,7 +8708,7 @@ dependencies = [ "reth-trie-db", "serde_json", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -8585,12 +8717,12 @@ dependencies = [ name = "reth-stages-api" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "aquamarine", "assert_matches", "auto_impl", "futures-util", - "metrics", + "metrics 0.23.0", "reth-consensus", "reth-db-api", "reth-errors", @@ -8604,7 +8736,7 @@ dependencies = [ "reth-static-file-types", "reth-testing-utils", "reth-tokio-util", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -8614,7 +8746,7 @@ dependencies = [ name = "reth-stages-types" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "arbitrary", "bytes", "modular-bitfield", @@ -8631,7 +8763,7 @@ dependencies = [ name = "reth-static-file" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "assert_matches", "parking_lot 0.12.3", "rayon", @@ -8654,7 +8786,7 @@ dependencies = [ name = "reth-static-file-types" version = "1.0.6" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "clap", "derive_more 1.0.0", "serde", @@ -8693,11 +8825,11 @@ dependencies = [ "auto_impl", "dyn-clone", "futures-util", - "metrics", + "metrics 0.23.0", "pin-project", "rayon", "reth-metrics", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-futures", @@ -8748,7 +8880,7 @@ dependencies = [ "bitflags 2.6.0", "criterion", "futures-util", - "metrics", + "metrics 0.23.0", "parking_lot 0.12.3", "paste", "pprof", @@ -8767,13 +8899,13 @@ dependencies = [ "reth-tasks", "reth-tracing", "revm", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "schnellru", "serde", "serde_json", "smallvec", "tempfile", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -8788,7 +8920,7 @@ dependencies = [ "criterion", "derive_more 1.0.0", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "proptest", "proptest-arbitrary-interop", "rayon", @@ -8816,7 +8948,7 @@ version = "1.0.6" dependencies = [ "alloy-consensus", "alloy-genesis", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rlp", "alloy-trie", "arbitrary", @@ -8845,7 +8977,7 @@ dependencies = [ "criterion", "derive_more 1.0.0", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "proptest", "proptest-arbitrary-interop", "rayon", @@ -8878,7 +9010,7 @@ dependencies = [ "criterion", "derive_more 1.0.0", "itertools 0.13.0", - "metrics", + "metrics 0.23.0", "proptest", "proptest-arbitrary-interop", "rand 0.8.5", @@ -8892,7 +9024,7 @@ dependencies = [ "reth-tasks", "reth-trie", "reth-trie-db", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -8900,7 +9032,7 @@ dependencies = [ [[package]] name = "revm" version = "14.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=v43-gwyneth#959611e7a6ceeb693acffe00ba8e4d976591479f" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#a7dfafe54b4f6b8f858e7fdb4e7cf4ac373310d7" dependencies = [ "auto_impl", "cfg-if", @@ -8914,9 +9046,9 @@ dependencies = [ [[package]] name = "revm-inspectors" version = "0.6.0" -source = "git+https://github.com/taikoxyz/revm-inspectors.git?branch=main-rbuilder#a7db16ce222d58eac84cfeeed4b5a9541dadc1d0" +source = "git+https://github.com/taikoxyz/revm-inspectors.git?branch=main-rbuilder#95bcbfb09cfb7011cf0c3e360e3d7258bc8a8f84" dependencies = [ - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "alloy-rpc-types-eth", "alloy-rpc-types-trace", "alloy-sol-types", @@ -8926,13 +9058,13 @@ dependencies = [ "colorchoice", "revm", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "revm-interpreter" version = "10.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=v43-gwyneth#959611e7a6ceeb693acffe00ba8e4d976591479f" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#a7dfafe54b4f6b8f858e7fdb4e7cf4ac373310d7" dependencies = [ "revm-primitives", "serde", @@ -8941,7 +9073,7 @@ dependencies = [ [[package]] name = "revm-precompile" version = "11.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=v43-gwyneth#959611e7a6ceeb693acffe00ba8e4d976591479f" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#a7dfafe54b4f6b8f858e7fdb4e7cf4ac373310d7" dependencies = [ "aurora-engine-modexp", "blst", @@ -8960,10 +9092,10 @@ dependencies = [ [[package]] name = "revm-primitives" version = "9.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=v43-gwyneth#959611e7a6ceeb693acffe00ba8e4d976591479f" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#a7dfafe54b4f6b8f858e7fdb4e7cf4ac373310d7" dependencies = [ "alloy-eips", - "alloy-primitives 0.8.7", + "alloy-primitives 0.8.14", "auto_impl", "bitflags 2.6.0", "bitvec", @@ -8988,9 +9120,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.48" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f86ae463694029097b846d8f99fd5536740602ae00022c0c50c5600720b2f71" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" dependencies = [ "bytemuck", ] @@ -9027,9 +9159,9 @@ dependencies = [ [[package]] name = "rlimit" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3560f70f30a0f16d11d01ed078a07740fe6b489667abc7c7b029155d9f21c3d8" +checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" dependencies = [ "libc", ] @@ -9046,9 +9178,9 @@ dependencies = [ [[package]] name = "roaring" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4b84ba6e838ceb47b41de5194a60244fac43d9fe03b71dbe8c5a201081d6d1" +checksum = "f81dc953b2244ddd5e7860cb0bb2a790494b898ef321d4aff8e260efab60cc88" dependencies = [ "bytemuck", "byteorder", @@ -9114,9 +9246,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" dependencies = [ "rand 0.8.5", ] @@ -9138,18 +9270,18 @@ dependencies = [ [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver 1.0.23", ] [[package]] name = "rustix" -version = "0.38.35" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a85d50532239da68e9addb745ba38ff4612a242c1c7ceea689c4bc7c2f43c36f" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.6.0", "errno", @@ -9160,9 +9292,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "log", "once_cell", @@ -9175,32 +9307,46 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04182dffc9091a404e0fc069ea5cd60e5b866c3adf881eff99a32d048242dffa" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", "rustls-pemfile", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.0.1", ] [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-platform-verifier" @@ -9208,16 +9354,16 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afbb878bdfdf63a336a5e63561b1835e7a8c91524f51621db870169eac84b490" dependencies = [ - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "jni", "log", "once_cell", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.7.3", "rustls-platform-verifier-android", "rustls-webpki", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "webpki-roots", "winapi", @@ -9231,9 +9377,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.102.7" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84678086bd54edf2b415183ed7a94d0efb049f1b646a33e22a36f3794be6ae56" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -9242,9 +9388,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "rusty-fork" @@ -9281,20 +9427,20 @@ dependencies = [ [[package]] name = "scc" -version = "2.1.16" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb7ac86243095b70a7920639507b71d51a63390d1ba26c4f60a552fbb914a37" +checksum = "66b202022bb57c049555430e11fc22fea12909276a80a4c3d368da36ac1d88ed" dependencies = [ "sdd", ] [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -9316,9 +9462,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sdd" -version = "3.0.2" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0495e4577c672de8254beb68d01a9b62d0e8a13c099edecdbedccce3223cd29f" +checksum = "49c1eeaf4b6a87c7479688c6d52b9f1153cedd3c489300564f932b065c6eab95" [[package]] name = "sec1" @@ -9336,9 +9482,9 @@ dependencies = [ [[package]] name = "secp256k1" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ "rand 0.8.5", "secp256k1-sys", @@ -9347,9 +9493,9 @@ dependencies = [ [[package]] name = "secp256k1-sys" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" dependencies = [ "cc", ] @@ -9361,23 +9507,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "libc", "num-bigint", "security-framework-sys", ] +[[package]] +name = "security-framework" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "seedable_hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed064ed6aaf88eb6a28ae191f5871a7fcdd2858e1cd6e1ffcc746baef8cd3cfd" +dependencies = [ + "wyhash", +] + [[package]] name = "semver" version = "0.11.0" @@ -9398,9 +9566,9 @@ dependencies = [ [[package]] name = "semver-parser" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" dependencies = [ "pest", ] @@ -9419,9 +9587,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -9437,22 +9605,22 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "memchr", "ryu", @@ -9467,14 +9635,25 @@ checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" dependencies = [ "percent-encoding", "serde", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -9493,15 +9672,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -9511,21 +9690,21 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "serial_test" -version = "3.1.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b4b487fe2acf240a021cf57c6b2b4903b1e78ca0ecd862a71b71d2a51fed77d" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" dependencies = [ "futures", "log", @@ -9537,13 +9716,13 @@ dependencies = [ [[package]] name = "serial_test_derive" -version = "3.1.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -9593,9 +9772,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d79b758b7cb2085612b11a235055e485605a5103faccdd633f35bd7aee69dd" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" dependencies = [ "cc", "cfg-if", @@ -9677,9 +9856,9 @@ dependencies = [ [[package]] name = "similar-asserts" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e041bb827d1bfca18f213411d51b665309f1afb37a04a5d1464530e13779fc0f" +checksum = "cfe85670573cd6f0fa97940f26e7e6601213c3b0555246c24234131f88c5709e" dependencies = [ "console", "similar", @@ -9693,7 +9872,7 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -9746,9 +9925,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -9756,9 +9935,9 @@ dependencies = [ [[package]] name = "soketto" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37468c595637c10857701c990f93a40ce0e357cedb0953d1c26c8d8027f9bb53" +checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" dependencies = [ "base64 0.22.1", "bytes", @@ -9775,6 +9954,9 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "spki" @@ -9799,7 +9981,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -9841,11 +10023,11 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "heck 0.5.0", + "heck", "proc-macro2", "quote", "rustversion", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -9879,9 +10061,9 @@ dependencies = [ [[package]] name = "symbolic-common" -version = "12.10.0" +version = "12.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16629323a4ec5268ad23a575110a724ad4544aae623451de600c747bf87b36cf" +checksum = "e5ba5365997a4e375660bed52f5b42766475d5bc8ceb1bb13fea09c469ea0f49" dependencies = [ "debugid", "memmap2", @@ -9891,9 +10073,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.10.0" +version = "12.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c043a45f08f41187414592b3ceb53fb0687da57209cc77401767fb69d5b596" +checksum = "beff338b2788519120f38c59ff4bb15174f52a183e547bac3d6072c2c0aa48aa" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -9913,9 +10095,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.76" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -9924,21 +10106,27 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.7" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20e7b52ad118b2153644eea95c6fc740b6c1555b2344fdab763fc9de4075f665" +checksum = "da0523f59468a2696391f2a772edc089342aacd53c3caa2ac3264e598edf119b" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] @@ -9951,7 +10139,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -9974,14 +10162,20 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-triple" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a4d50cdb458045afc8131fd91b64904da29548bcb63c7236e0844936c13078" + [[package]] name = "tempfile" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", - "fastrand 2.1.1", + "fastrand 2.2.0", "once_cell", "rustix", "windows-sys 0.59.0", @@ -10037,7 +10231,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -10061,22 +10255,42 @@ checksum = "a38c90d48152c236a3ab59271da4f4ae63d678c5d7ad6b7714d7cb9760be5e4b" [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f49a1853cf82743e3b7950f77e0f4d622ca36cf4317cba00c767838bac8d490" +dependencies = [ + "thiserror-impl 2.0.4", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "8381894bb3efe0c4acac3ded651301ceee58a15d47c2e34885ed1908ad667061" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -10151,9 +10365,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -10175,9 +10389,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -10229,18 +10443,18 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.2", + "mio 1.0.3", "parking_lot 0.12.3", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.7", + "socket2 0.5.8", "tokio-macros", "windows-sys 0.52.0", ] @@ -10253,7 +10467,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -10269,9 +10483,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -10297,9 +10511,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -10333,11 +10547,11 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -10365,6 +10579,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 0.1.2", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-http" version = "0.5.2" @@ -10389,7 +10617,7 @@ dependencies = [ "pin-project-lite", "tokio", "tokio-util", - "tower", + "tower 0.4.13", "tower-layer", "tower-service", "tracing", @@ -10410,9 +10638,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -10427,27 +10655,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror", + "thiserror 1.0.69", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -10465,26 +10693,15 @@ dependencies = [ [[package]] name = "tracing-journald" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba316a74e8fc3c3896a850dba2375928a9fa171b085ecddfc7c054d39970f3fd" +checksum = "fc0b4143302cf1022dac868d521e36e8b27691f72c84b3311750d5188ebba657" dependencies = [ "libc", "tracing-core", "tracing-subscriber", ] -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - [[package]] name = "tracing-logfmt" version = "0.3.5" @@ -10499,9 +10716,9 @@ dependencies = [ [[package]] name = "tracing-serde" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" dependencies = [ "serde", "tracing-core", @@ -10509,22 +10726,19 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", - "nu-ansi-term", "once_cell", "regex", "serde", "serde_json", "sharded-slab", - "smallvec", "thread_local", "tracing", "tracing-core", - "tracing-log", "tracing-serde", ] @@ -10556,7 +10770,7 @@ dependencies = [ "once_cell", "rand 0.8.5", "smallvec", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tokio", "tracing", @@ -10578,7 +10792,7 @@ dependencies = [ "rand 0.8.5", "resolv-conf", "smallvec", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "trust-dns-proto", @@ -10592,14 +10806,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.99" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "207aa50d36c4be8d8c6ea829478be44a372c6a77669937bb39c698e52f1491e8" +checksum = "8dcd332a5496c026f1e14b7f3d2b7bd98e509660c04239c58b0ba38a12daded4" dependencies = [ "glob", "serde", "serde_derive", "serde_json", + "target-triple", "termcolor", "toml", ] @@ -10620,7 +10835,7 @@ dependencies = [ "rustls", "rustls-pki-types", "sha1", - "thiserror", + "thiserror 1.0.69", "utf-8", ] @@ -10632,9 +10847,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -10656,39 +10871,36 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-truncate" @@ -10698,20 +10910,26 @@ checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" dependencies = [ "itertools 0.13.0", "unicode-segmentation", - "unicode-width", + "unicode-width 0.1.14", ] [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unicode-xid" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "universal-hash" @@ -10725,9 +10943,9 @@ dependencies = [ [[package]] name = "unsigned-varint" -version = "0.7.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" [[package]] name = "untrusted" @@ -10737,12 +10955,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna 1.0.3", "percent-encoding", "serde", ] @@ -10773,9 +10991,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom 0.2.15", ] @@ -10854,9 +11072,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "d15e63b4482863c109d70a7b8706c1e364eb6ea449b201a76c5b89cedcec2d5c" dependencies = [ "cfg-if", "once_cell", @@ -10865,36 +11083,37 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "8d36ef12e3aaca16ddd3f67922bc63e48e953f126de60bd33ccc0101ef9998cd" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "9dfaf8f50e5f293737ee323940c7d8b08a66a95a419223d9f41610ca08b0833d" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "705440e08b42d3e4b36de7d66c944be628d579796b8090bfa3471478a2260051" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -10902,28 +11121,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "98c9ae5a76e46f4deecd0f0255cc223cfa18dc9b261213b8aa0c7b36f61b3f1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "6ee99da9c5ba11bd675621338ef6fa52296b76b83305e9b6e5c77d4c286d6d49" [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -10934,9 +11153,19 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a98bc3c33f0fe7e59ad7cd041b89034fa82a7c2d4365ca538dda6cdaf513863c" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -10944,9 +11173,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.3" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" dependencies = [ "rustls-pki-types", ] @@ -11000,11 +11229,11 @@ dependencies = [ [[package]] name = "windows" -version = "0.57.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core 0.57.0", + "windows-core 0.58.0", "windows-targets 0.52.6", ] @@ -11019,36 +11248,37 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.57.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ "windows-implement", "windows-interface", - "windows-result 0.1.2", + "windows-result", + "windows-strings", "windows-targets 0.52.6", ] [[package]] name = "windows-implement" -version = "0.57.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "windows-interface" -version = "0.57.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -11057,20 +11287,11 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ - "windows-result 0.2.0", + "windows-result", "windows-strings", "windows-targets 0.52.6", ] -[[package]] -name = "windows-result" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-result" version = "0.2.0" @@ -11086,7 +11307,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-result 0.2.0", + "windows-result", "windows-targets 0.52.6", ] @@ -11240,9 +11461,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -11280,9 +11501,9 @@ dependencies = [ "js-sys", "log", "pharos", - "rustc_version 0.4.0", + "rustc_version 0.4.1", "send_wrapper 0.6.0", - "thiserror", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -11308,9 +11529,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -11320,13 +11541,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", "synstructure", ] @@ -11348,27 +11569,27 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", "synstructure", ] @@ -11389,7 +11610,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] @@ -11411,7 +11632,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.90", ] [[package]] From a031b78e40f986dd2213384a29d8b844d7c45b84 Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Thu, 12 Dec 2024 20:14:37 +0100 Subject: [PATCH 07/24] Fix EVM.sol for latest revm --- packages/protocol/contracts/examples/EVM.sol | 51 +++++++++++--------- packages/protocol/scripts/xTransfer.s.sol | 10 ++-- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/packages/protocol/contracts/examples/EVM.sol b/packages/protocol/contracts/examples/EVM.sol index d72ab7b10e66..21d2a64f0812 100644 --- a/packages/protocol/contracts/examples/EVM.sol +++ b/packages/protocol/contracts/examples/EVM.sol @@ -1,68 +1,71 @@ // SPDX-License-Identifier: MIT pragma solidity >=0.8.12 <0.9.0; - // EVM library library EVM { - // precompile addresses address constant xCallOptionsAddress = address(0x04D2); uint constant l1ChainId = 1; - uint constant version = 1; + uint16 constant version = 1; function xCallOnL1() - public - view + internal + view { xCallOptions(l1ChainId); } + function xCallOnL1(bool sandbox) + internal + view + { + xCallOptions(l1ChainId, sandbox); + } + function xCallOptions(uint chainID) - public - view + internal + view { - xCallOptions(chainID, true); + xCallOptions(chainID, false); } function xCallOptions(uint chainID, bool sandbox) - public - view + internal + view { - xCallOptions(chainID, sandbox, address(0), address(0)); + xCallOptions(chainID, sandbox, tx.origin, address(this)); } function xCallOptions(uint chainID, bool sandbox, address txOrigin, address msgSender) - public - view + internal + view { xCallOptions(chainID, sandbox, txOrigin, msgSender, 0x0, ""); } function xCallOptions(uint chainID, bool sandbox, bytes32 blockHash, bytes memory proof) - public - view + internal + view { xCallOptions(chainID, sandbox, address(0), address(0), blockHash, proof); } function xCallOptions(uint chainID, bool sandbox, address txOrigin, address msgSender, bytes32 blockHash, bytes memory proof) - public - view + internal + view { - // This precompile is not supported on L1 - require(chainID != l1ChainId); + // require(chainID() != l1ChainId); - // Call the custom precompile - bytes memory input = abi.encodePacked(version, chainID, sandbox, txOrigin, msgSender, blockHash, proof); - (bool success, ) = xCallOptionsAddress.staticcall(input); + bytes memory input = abi.encodePacked(version, uint64(chainID), sandbox, txOrigin, msgSender, blockHash, proof); + (bool success, ) = xCallOptionsAddress.staticcall(input); //delegatecall require(success); } - function isOnL1() public view returns (bool) { + function isOnL1() internal view returns (bool) { return chainId() == l1ChainId; } - function chainId() public view returns (uint256) { + function chainId() internal view returns (uint256) { return block.chainid; } } \ No newline at end of file diff --git a/packages/protocol/scripts/xTransfer.s.sol b/packages/protocol/scripts/xTransfer.s.sol index 02f578e3875b..57b0b40e723e 100644 --- a/packages/protocol/scripts/xTransfer.s.sol +++ b/packages/protocol/scripts/xTransfer.s.sol @@ -13,22 +13,22 @@ contract XTransfer is Script { address ALICE = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; //Can stay as is - test values anyways address BOB = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; //Can stay as is - test values anyways uint256 ALICE_PK = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80;//Can stay as is - test values anyways - + function setUp() public {} function run() public { address alice = vm.addr(ALICE_PK); - + console.log("\n=== Before Transfer ==="); //checkBalances(); -> EXPLORER - + vm.startBroadcast(ALICE_PK); // Transfer 666 tokens to Bob on L2B (chainId: 167011) - xERC20(TOKEN_ADDRESS).xTransfer(167011, BOB, 666); + xERC20(TOKEN_ADDRESS).xTransfer(167010, BOB, 666); vm.stopBroadcast(); - + console.log("\n=== After Transfer ==="); //checkBalances(); -> EXPLORER } From 5e71f76da83a86a78ee3a1dbed633d71d9da82fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keszey=20D=C3=A1niel?= Date: Fri, 13 Dec 2024 10:51:10 +0100 Subject: [PATCH 08/24] fix deployment issue --- .../protocol/scripts/deploy_and_xtransfer.sh | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/protocol/scripts/deploy_and_xtransfer.sh b/packages/protocol/scripts/deploy_and_xtransfer.sh index a540399b5984..ee8f65a2473d 100755 --- a/packages/protocol/scripts/deploy_and_xtransfer.sh +++ b/packages/protocol/scripts/deploy_and_xtransfer.sh @@ -6,12 +6,10 @@ RED='\033[0;31m' YELLOW='\033[1;33m' NC='\033[0m' # No Color -# Contract address we expect after deployment -CONTRACT_ADDRESS="0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" - # Function to check if contract is deployed check_contract_deployment() { local rpc_url=$1 + local contract_addr=$2 local retries=30 # Number of retries (30 * 2 = 60 seconds max wait) local deployed=false @@ -19,7 +17,7 @@ check_contract_deployment() { for i in $(seq 1 $retries); do # Using curl to check if the contract code exists at the address - result=$(curl -s -X POST -H "Content-Type: application/json" --data "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getCode\",\"params\":[\"$CONTRACT_ADDRESS\", \"latest\"],\"id\":1}" $rpc_url) + result=$(curl -s -X POST -H "Content-Type: application/json" --data "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getCode\",\"params\":[\"$contract_addr\", \"latest\"],\"id\":1}" $rpc_url) # Check if the result contains more than just "0x" (empty contract) if [[ $result == *"0x60806040"* ]]; then @@ -41,11 +39,22 @@ check_contract_deployment() { } echo -e "${GREEN}Deploying to L2A...${NC}" -forge script --rpc-url http://127.0.0.1:32005 scripts/DeployXERC20.s.sol -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy +# Capture the forge script output +L2A_OUTPUT=$(forge script --rpc-url http://127.0.0.1:32005 scripts/DeployXERC20.s.sol -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy) + +# Extract the contract address - improved pattern matching +CONTRACT_ADDRESS=$(echo "$L2A_OUTPUT" | grep -o '0x[a-fA-F0-9]\{40\}' | head -n 1) + +if [ -z "$CONTRACT_ADDRESS" ]; then + echo -e "${RED}Failed to extract contract address from deployment output${NC}" + exit 1 +fi + +echo -e "${GREEN}Extracted contract address: $CONTRACT_ADDRESS${NC}" if [ $? -eq 0 ]; then # Check if contract is deployed on L2A - if check_contract_deployment "http://127.0.0.1:32005"; then + if check_contract_deployment "http://127.0.0.1:32005" "$CONTRACT_ADDRESS"; then echo -e "${GREEN}Verifying L2A contract...${NC}" forge verify-contract "$CONTRACT_ADDRESS" "contracts/examples/xERC20.sol:xERC20" --watch --verifier-url "http://localhost:64003/api" --verifier blockscout --chain-id 167010 --libraries contracts/examples/EVM.sol:EVM:0x5FbDB2315678afecb367f032d93F642f64180aa3 else @@ -62,7 +71,7 @@ forge script --rpc-url http://127.0.0.1:32006 scripts/DeployXERC20.s.sol -vvvv - if [ $? -eq 0 ]; then # Check if contract is deployed on L2B - if check_contract_deployment "http://127.0.0.1:32006"; then + if check_contract_deployment "http://127.0.0.1:32006" "$CONTRACT_ADDRESS"; then echo -e "${GREEN}Verifying L2B contract...${NC}" forge verify-contract "$CONTRACT_ADDRESS" "contracts/examples/xERC20.sol:xERC20" --watch --verifier-url "http://localhost:64005/api" --verifier blockscout --chain-id 167011 --libraries contracts/examples/EVM.sol:EVM:0x5FbDB2315678afecb367f032d93F642f64180aa3 else From 1372ac42dc1f5881477afe88063e0389f8ae55c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keszey=20D=C3=A1niel?= Date: Fri, 13 Dec 2024 10:58:22 +0100 Subject: [PATCH 09/24] changed contract address --- packages/protocol/scripts/xTransfer.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/protocol/scripts/xTransfer.s.sol b/packages/protocol/scripts/xTransfer.s.sol index 57b0b40e723e..a56f913ecf3c 100644 --- a/packages/protocol/scripts/xTransfer.s.sol +++ b/packages/protocol/scripts/xTransfer.s.sol @@ -8,7 +8,7 @@ import "../contracts/examples/xERC20.sol"; contract XTransfer is Script { // The deployed contract address (will be the same on both chains due to deterministic deployment) - address constant TOKEN_ADDRESS = 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512; + address constant TOKEN_ADDRESS = 0x5FbDB2315678afecb367f032d93F642f64180aa3; address ALICE = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; //Can stay as is - test values anyways address BOB = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; //Can stay as is - test values anyways From 91d12f0823a0a55ace855b1522ff32d61d0e283b Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Fri, 13 Dec 2024 13:23:22 +0100 Subject: [PATCH 10/24] Add builder support for external db dependencies --- crates/gwyneth/src/builder.rs | 10 ++++++---- crates/gwyneth/src/exex.rs | 21 ++++++++++++++++++--- crates/gwyneth/src/lib.rs | 6 +++--- crates/revm/src/database.rs | 8 ++++---- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/crates/gwyneth/src/builder.rs b/crates/gwyneth/src/builder.rs index ba5af0231e65..714245e2178d 100644 --- a/crates/gwyneth/src/builder.rs +++ b/crates/gwyneth/src/builder.rs @@ -81,10 +81,12 @@ where let state = StateProviderDatabase::new(state_provider); let mut sync_state = SyncStateProviderDatabase::new(Some(chain_spec.chain().id()), state); - let (l1_id, l1_provider) = attributes.l1_provider.unwrap(); - let l1_box: Box = Box::new(l1_provider); - let l1_state = StateProviderDatabase::new(l1_box); - sync_state.add_db(l1_id, l1_state); + // Add all external state dependencies + for (&chain_id, provider) in attributes.providers.iter() { + let boxed: Box = Box::new(provider); + let state_provider = StateProviderDatabase::new(boxed); + sync_state.add_db(chain_id, state_provider); + } let mut sync_cached_reads = to_sync_cached_reads(cached_reads, chain_spec.chain.id()); let mut sync_db = State::builder() diff --git a/crates/gwyneth/src/exex.rs b/crates/gwyneth/src/exex.rs index 6ae2206a7be4..704ff03855c8 100644 --- a/crates/gwyneth/src/exex.rs +++ b/crates/gwyneth/src/exex.rs @@ -21,7 +21,7 @@ use reth_primitives::{ address, Address, SealedBlock, SealedBlockWithSenders, TransactionSigned, B256, U256, }; use reth_provider::{ - providers::BlockchainProvider, CanonStateSubscriptions, DatabaseProviderFactory, + providers::BlockchainProvider, BlockNumReader, CanonStateSubscriptions, DatabaseProviderFactory, }; use reth_rpc_types::engine::PayloadStatusEnum; use reth_transaction_pool::{ @@ -152,8 +152,22 @@ impl Rollup { let mut builder_attrs = GwynethPayloadBuilderAttributes::try_new(B256::ZERO, attrs).unwrap(); - builder_attrs.l1_provider = - Some((self.ctx.config.chain.chain().id(), Arc::new(l1_state_provider))); + builder_attrs.providers.insert(self.ctx.config.chain.chain().id(), Arc::new(l1_state_provider)); + + // Add all other L2 dbs for now as well until dependencies are broken + for node in self.nodes.iter() { + let chain_id = node.config.chain.chain().id(); + if chain_id != node_chain_id { + let state_provider = node + .provider + .database_provider_ro() + .unwrap(); + let last_block_number = state_provider.last_block_number()?; + let state_provider = state_provider.state_provider_by_block_number(last_block_number).unwrap(); + + builder_attrs.providers.insert(chain_id, Arc::new(state_provider)); + } + } let payload_id = builder_attrs.inner.payload_id(); let parrent_beacon_block_root = @@ -181,6 +195,7 @@ impl Rollup { } } else { println!("Gwyneth: No block?"); + tokio::time::sleep(std::time::Duration::from_millis(100)).await; continue; } break; diff --git a/crates/gwyneth/src/lib.rs b/crates/gwyneth/src/lib.rs index 863d737e689a..4b5bd11c4614 100644 --- a/crates/gwyneth/src/lib.rs +++ b/crates/gwyneth/src/lib.rs @@ -1,5 +1,5 @@ //! Ethereum Node types config. -use std::{fmt::Debug, sync::Arc}; +use std::{collections::HashMap, fmt::Debug, sync::Arc}; use builder::default_gwyneth_payload_builder; use reth_evm_ethereum::EthEvmConfig; @@ -113,7 +113,7 @@ pub struct GwynethPayloadBuilderAttributes { /// The gas limit for the generated payload pub gas_limit: Option, - pub l1_provider: Option<(ChainId, SyncProvider)>, + pub providers: HashMap, } impl PayloadBuilderAttributes @@ -137,7 +137,7 @@ impl PayloadBuilderAttributes inner: EthPayloadBuilderAttributes::new(parent, attributes.inner), transactions, gas_limit: attributes.gas_limit, - l1_provider: None, + providers: HashMap::default(), }) } diff --git a/crates/revm/src/database.rs b/crates/revm/src/database.rs index bf57483f3edd..ef9ee03d5293 100644 --- a/crates/revm/src/database.rs +++ b/crates/revm/src/database.rs @@ -93,7 +93,7 @@ impl SyncEvmStateProvider for SyncStateProviderDatabase SyncEvmStateProvider for SyncStateProviderDatabase SyncEvmStateProvider for SyncStateProviderDatabase SyncEvmStateProvider for SyncStateProviderDatabase Date: Wed, 18 Dec 2024 14:10:52 +0100 Subject: [PATCH 11/24] temp fix tx without chain_id (simulated call()) --- crates/rpc/rpc-eth-api/src/helpers/call.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/rpc/rpc-eth-api/src/helpers/call.rs b/crates/rpc/rpc-eth-api/src/helpers/call.rs index c1cc851b4076..8e510f28fc10 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/call.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/call.rs @@ -891,7 +891,7 @@ pub trait Call: LoadState + SpawnBlocking { .. } = request; - let chain_id_inner = chain_id.unwrap_or(ETHEREUM_CHAIN_ID); + let chain_id_inner = chain_id.unwrap_or(L1_CHAIN_ID); //Todo: fix long term - no default for simulated call()! let CallFees { max_priority_fee_per_gas, gas_price, max_fee_per_blob_gas } = CallFees::ensure_fees( gas_price.map(U256::from), From 51a69b9b0e339d4b39e9ff78ddc5dc95c462e57a Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Wed, 18 Dec 2024 22:05:10 +0100 Subject: [PATCH 12/24] set chain_id to reasonable value when not known in estimate_gas --- crates/rpc/rpc-eth-api/src/helpers/call.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/rpc/rpc-eth-api/src/helpers/call.rs b/crates/rpc/rpc-eth-api/src/helpers/call.rs index 8e510f28fc10..b02e76274232 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/call.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/call.rs @@ -585,6 +585,11 @@ pub trait Call: LoadState + SpawnBlocking { // set nonce to None so that the correct nonce is chosen by the EVM request.nonce = None; + // set chain_id to the config chain id if unknown + if request.chain_id == None { + request.chain_id = Some(cfg.chain_id); + } + // Keep a copy of gas related request values let tx_request_gas_limit = request.gas; let tx_request_gas_price = request.gas_price; @@ -891,7 +896,7 @@ pub trait Call: LoadState + SpawnBlocking { .. } = request; - let chain_id_inner = chain_id.unwrap_or(L1_CHAIN_ID); //Todo: fix long term - no default for simulated call()! + let chain_id_inner = chain_id.expect("chain id unknown"); let CallFees { max_priority_fee_per_gas, gas_price, max_fee_per_blob_gas } = CallFees::ensure_fees( gas_price.map(U256::from), @@ -921,7 +926,7 @@ pub trait Call: LoadState + SpawnBlocking { .try_into_unique_input() .map_err(Self::Error::from_eth_err)? .unwrap_or_default(), - chain_ids: Some(std::iter::once(L1_CHAIN_ID) + chain_ids: Some(std::iter::once(L1_CHAIN_ID) .chain((0..NUM_L2_CHAINS) .map(|i| BASE_CHAIN_ID + i)) .collect::>()), From 87d3233208ae6ae68a05f93ec7343c5599de708b Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Thu, 19 Dec 2024 15:00:26 +0100 Subject: [PATCH 13/24] try to fix chain_id again for rpc calls --- crates/rpc/rpc-eth-api/src/helpers/call.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/rpc/rpc-eth-api/src/helpers/call.rs b/crates/rpc/rpc-eth-api/src/helpers/call.rs index b02e76274232..609879ff3037 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/call.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/call.rs @@ -585,11 +585,6 @@ pub trait Call: LoadState + SpawnBlocking { // set nonce to None so that the correct nonce is chosen by the EVM request.nonce = None; - // set chain_id to the config chain id if unknown - if request.chain_id == None { - request.chain_id = Some(cfg.chain_id); - } - // Keep a copy of gas related request values let tx_request_gas_limit = request.gas; let tx_request_gas_price = request.gas_price; @@ -952,6 +947,13 @@ pub trait Call: LoadState + SpawnBlocking { block: BlockEnv, request: TransactionRequest, ) -> Result { + let mut request = request; + + // set chain_id to the config chain id if unknown + if request.chain_id == None { + request.chain_id = Some(cfg.chain_id); + } + let tx = self.create_txn_env(&block, request)?; Ok(EnvWithHandlerCfg::new_with_cfg_env(cfg, block, tx)) } From ef01ba493325a59fff9826ae22044b5a84fb92d7 Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Fri, 20 Dec 2024 03:17:35 +0100 Subject: [PATCH 14/24] cross chain calls potentially working --- bin/reth/src/main.rs | 9 +- crates/blockchain-tree/src/blockchain_tree.rs | 127 ++++++++------- crates/blockchain-tree/src/chain.rs | 144 ++++++++++++------ crates/gwyneth/src/exex.rs | 14 +- crates/node/builder/src/builder/mod.rs | 5 +- crates/rpc/rpc-eth-api/src/helpers/call.rs | 35 ++++- crates/storage/provider/src/lib.rs | 15 ++ crates/storage/provider/src/providers/mod.rs | 2 +- packages/protocol/scripts/xTransfer.s.sol | 2 +- 9 files changed, 240 insertions(+), 113 deletions(-) diff --git a/bin/reth/src/main.rs b/bin/reth/src/main.rs index 6d975a178e64..148849557b4c 100644 --- a/bin/reth/src/main.rs +++ b/bin/reth/src/main.rs @@ -9,6 +9,7 @@ use reth::args::{DiscoveryArgs, NetworkArgs, RpcServerArgs}; use reth_chainspec::ChainSpecBuilder; use reth_node_builder::{NodeBuilder, NodeConfig, NodeHandle}; use reth_node_ethereum::EthereumNode; +use reth_provider::NODES; use reth_tasks::TaskManager; const BASE_CHAIN_ID: u64 = gwyneth::exex::BASE_CHAIN_ID; // Base chain ID for L2s @@ -49,13 +50,16 @@ fn main() -> eyre::Result<()> { .with_static_l2_rpc_ip_and_port(chain_id) ); + let chain_id = chain_spec.chain.id(); + let NodeHandle { node: gwyneth_node, node_exit_future: _ } = NodeBuilder::new(node_config.clone()) - .gwyneth_node(exec.clone(), chain_spec.chain.id()) + .gwyneth_node(exec.clone(), chain_id) .node(GwynethNode::default()) .launch() .await?; + NODES.lock().unwrap().insert(chain_id, gwyneth_node.provider.clone()); gwyneth_nodes.push(gwyneth_node); } @@ -67,6 +71,9 @@ fn main() -> eyre::Result<()> { .launch() .await?; + + NODES.lock().unwrap().insert(handle.node.chain_spec().chain.id(), handle.node.provider.clone()); + handle.wait_for_node_exit().await }) } diff --git a/crates/blockchain-tree/src/blockchain_tree.rs b/crates/blockchain-tree/src/blockchain_tree.rs index cb58230c5b04..fd8bda3cd5cd 100644 --- a/crates/blockchain-tree/src/blockchain_tree.rs +++ b/crates/blockchain-tree/src/blockchain_tree.rs @@ -21,7 +21,7 @@ use reth_primitives::{ use reth_provider::{ BlockExecutionWriter, BlockNumReader, BlockWriter, CanonStateNotification, CanonStateNotificationSender, CanonStateNotifications, ChainSpecProvider, ChainSplit, - ChainSplitTarget, DisplayBlocksChain, HeaderProvider, ProviderError, StaticFileProviderFactory, + ChainSplitTarget, DisplayBlocksChain, HeaderProvider, ProviderError, StaticFileProviderFactory, NODES, }; use reth_prune_types::PruneModes; use reth_stages_api::{MetricEvent, MetricEventsSender}; @@ -648,6 +648,7 @@ where return None; }; + println!("insert_unwound_chain"); debug!(target: "blockchain_tree", unwound_block= ?block.num_hash(), chain_id = ?chain_id, @@ -1224,63 +1225,81 @@ where ) -> Result<(), CanonicalError> { // Brecht reorg state trie calculation let (blocks, state, chain_trie_updates) = chain.into_inner(); - let hashed_state = state.hash_state_slow(); - let prefix_sets = hashed_state.construct_prefix_sets().freeze(); - let hashed_state_sorted = hashed_state.into_sorted(); - - // Compute state root or retrieve cached trie updates before opening write transaction. - let block_hash_numbers = - blocks.iter().map(|(number, b)| (number, b.hash())).collect::>(); - let trie_updates = match chain_trie_updates { - Some(updates) => { - debug!(target: "blockchain_tree", blocks = ?block_hash_numbers, "Using cached trie updates"); - self.metrics.trie_updates_insert_cached.increment(1); - updates + //let hashed_state = state.hash_state_slow(); + //let prefix_sets = hashed_state.construct_prefix_sets().freeze(); + //let hashed_state_sorted = hashed_state.into_sorted(); + + let providers = NODES.lock().unwrap(); + + for (&chain_id, provider) in providers.iter() { + let state = state.filter_chain(chain_id); + if state.bundle.is_empty() { + continue; } - None => { - debug!(target: "blockchain_tree", blocks = ?block_hash_numbers, "Recomputing state root for insert"); - let provider = self - .externals - .provider_factory - .provider()? - // State root calculation can take a while, and we're sure no write transaction - // will be open in parallel. See https://github.com/paradigmxyz/reth/issues/6168. - .disable_long_read_transaction_safety(); - let (state_root, trie_updates) = StateRoot::from_tx(provider.tx_ref()) - .with_hashed_cursor_factory(HashedPostStateCursorFactory::new( - DatabaseHashedCursorFactory::new(provider.tx_ref()), - &hashed_state_sorted, - )) - .with_prefix_sets(prefix_sets) - .root_with_updates() - .map_err(Into::::into)?; - let tip = blocks.tip(); - if state_root != tip.state_root { - return Err(ProviderError::StateRootMismatch(Box::new(RootMismatch { - root: GotExpected { got: state_root, expected: tip.state_root }, - block_number: tip.number, - block_hash: tip.hash(), - })) - .into()) + + println!("applying state to: {}", chain_id); + + let hashed_state = state.hash_state_slow(); + let prefix_sets = hashed_state.construct_prefix_sets().freeze(); + let hashed_state_sorted = hashed_state.into_sorted(); + + // Compute state root or retrieve cached trie updates before opening write transaction. + //let block_hash_numbers = + // blocks.iter().map(|(number, b)| (number, b.hash())).collect::>(); + let trie_updates = match chain_trie_updates.clone() { + Some(updates) => { + //debug!(target: "blockchain_tree", blocks = ?block_hash_numbers, "Using cached trie updates"); + self.metrics.trie_updates_insert_cached.increment(1); + updates } - self.metrics.trie_updates_insert_recomputed.increment(1); - trie_updates - } - }; - recorder.record_relative(MakeCanonicalAction::RetrieveStateTrieUpdates); + None => { + //debug!(target: "blockchain_tree", blocks = ?block_hash_numbers, "Recomputing state root for insert"); + let provider = self + .externals + .provider_factory + .provider()? + // State root calculation can take a while, and we're sure no write transaction + // will be open in parallel. See https://github.com/paradigmxyz/reth/issues/6168. + .disable_long_read_transaction_safety(); + + let (state_root, trie_updates) = StateRoot::from_tx(provider.tx_ref()) + .with_hashed_cursor_factory(HashedPostStateCursorFactory::new( + DatabaseHashedCursorFactory::new(provider.tx_ref()), + &hashed_state_sorted.clone(), + )) + .with_prefix_sets(prefix_sets) + .root_with_updates() + .map_err(Into::::into)?; + // let tip = blocks.tip(); + // if state_root != tip.state_root { + // return Err(ProviderError::StateRootMismatch(Box::new(RootMismatch { + // root: GotExpected { got: state_root, expected: tip.state_root }, + // block_number: tip.number, + // block_hash: tip.hash(), + // })) + // .into()) + // } + self.metrics.trie_updates_insert_recomputed.increment(1); + trie_updates + } + }; + recorder.record_relative(MakeCanonicalAction::RetrieveStateTrieUpdates); - let provider_rw = self.externals.provider_factory.provider_rw()?; - provider_rw - .append_blocks_with_state( - blocks.into_blocks().collect(), - state, - hashed_state_sorted, - trie_updates, - ) - .map_err(|e| CanonicalError::CanonicalCommit(e.to_string()))?; + println!("bbb: commit_canonical_to_database"); + //let provider_rw = self.externals.provider_factory.provider_rw()?; + let provider_rw = provider.database.provider_rw()?; + provider_rw + .append_blocks_with_state( + blocks.clone().into_blocks().collect(), + state, + hashed_state_sorted, + trie_updates, + ) + .map_err(|e| CanonicalError::CanonicalCommit(e.to_string()))?; - provider_rw.commit()?; - recorder.record_relative(MakeCanonicalAction::CommitCanonicalChainToDatabase); + provider_rw.commit()?; + recorder.record_relative(MakeCanonicalAction::CommitCanonicalChainToDatabase); + } Ok(()) } diff --git a/crates/blockchain-tree/src/chain.rs b/crates/blockchain-tree/src/chain.rs index fa8c39d83b0a..9adc92f4e510 100644 --- a/crates/blockchain-tree/src/chain.rs +++ b/crates/blockchain-tree/src/chain.rs @@ -18,8 +18,7 @@ use reth_primitives::{ BlockHash, BlockNumber, ForkBlock, GotExpected, SealedBlockWithSenders, SealedHeader, U256, }; use reth_provider::{ - providers::{BundleStateProvider, ConsistentDbView}, - ChainSpecProvider, FullExecutionDataProvider, ProviderError, StateRootProvider, + providers::{BundleStateProvider, ConsistentDbView}, BlockNumReader, ChainSpecProvider, DatabaseProviderFactory, FullExecutionDataProvider, ProviderError, StateProvider, StateRootProvider, NODES }; use reth_revm::database::{StateProviderDatabase, SyncStateProviderDatabase}; use reth_trie::{updates::TrieUpdates, HashedPostState}; @@ -89,6 +88,7 @@ impl AppendableChain { canonical_fork, }; + println!("Brecht: new_canonical_fork"); let (bundle_state, trie_updates) = Self::validate_and_execute( block.clone(), parent_header, @@ -137,6 +137,7 @@ impl AppendableChain { canonical_block_hashes, canonical_fork, }; + println!("Brecht: new_chain_fork"); let (block_state, _) = Self::validate_and_execute( block.clone(), parent, @@ -205,13 +206,66 @@ impl AppendableChain { .disable_long_read_transaction_safety() .state_provider_by_block_number(canonical_fork.number)?; - let provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); - let db = SyncStateProviderDatabase::new( + // let provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); + + // // Brecht + // let mut super_db = SyncStateProviderDatabase::new( + // Some(externals.provider_factory.chain_spec().chain.id()), + // StateProviderDatabase::new(&provider), + // ); + + // // Add all external state dependencies + // let providers = NODES.lock().unwrap(); + // let mut chain_providers = Vec::new(); + // for (&chain_id, chain_provider) in providers.iter() { + // println!("Adding db for chain_id: {}", chain_id); + + // let state_provider = chain_provider + // .database_provider_ro() + // .unwrap(); + // let last_block_number = state_provider.last_block_number()?; + // let state_provider = state_provider.state_provider_by_block_number(last_block_number).unwrap(); + + // let chain_provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); + // chain_providers.push(chain_provider); + + // //let boxed: Box = Box::new(state_provider); + // //let state_provider = StateProviderDatabase::new(boxed); + // super_db.add_db(chain_id, StateProviderDatabase::new(&chain_providers.last().unwrap())); + // } + + // Brecht + let mut super_db = SyncStateProviderDatabase::new( Some(externals.provider_factory.chain_spec().chain.id()), - StateProviderDatabase::new(&provider), + StateProviderDatabase::new(state_provider), ); - let executor = externals.executor_factory.executor(db); + + println!("Brecht executed: Adding db for chain_id: {}", externals.provider_factory.chain_spec().chain.id()); + // Add all external state dependencies + let providers = NODES.lock().unwrap(); + //let mut chain_providers = Vec::new(); + for (&chain_id, chain_provider) in providers.iter() { + if chain_id == externals.provider_factory.chain_spec().chain.id() { + continue; + } + println!("Brecht executed: Adding db for chain_id: {}", chain_id); + + let state_provider = chain_provider + .database_provider_ro() + .unwrap(); + let last_block_number = state_provider.last_block_number()?; + let state_provider = state_provider.state_provider_by_block_number(last_block_number).unwrap(); + + //let chain_provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); + //chain_providers.push(chain_provider); + + //let boxed: Box = Box::new(state_provider); + //let state_provider = StateProviderDatabase::new(boxed); + super_db.add_db(chain_id, StateProviderDatabase::new(state_provider)); + } + + let executor = externals.executor_factory.executor(super_db); let block_hash = block.hash(); let block = block.unseal(); @@ -224,48 +278,51 @@ impl AppendableChain { let chain_id = externals.provider_factory.chain_spec().chain.id(); let initial_execution_outcome = ExecutionOutcome::from((state, chain_id, block.number)); + + //let initial_execution_outcome = initial_execution_outcome.filter_chain(externals.provider_factory.chain_spec().chain.id()); + // check state root if the block extends the canonical chain __and__ if state root // validation was requested. - if block_validation_kind.is_exhaustive() { - // calculate and check state root - let start = Instant::now(); - let (state_root, trie_updates) = if block_attachment.is_canonical() { - // TODO(Cecilie): refactor the bundle state provider for cross-chain bundles - let mut execution_outcome = - provider.block_execution_data_provider.execution_outcome().clone(); - execution_outcome.chain_id = chain_id; - execution_outcome.extend(initial_execution_outcome.clone()); - let hashed_state = execution_outcome.hash_state_slow(); - ParallelStateRoot::new(consistent_view, hashed_state) - .incremental_root_with_updates() - .map(|(root, updates)| (root, Some(updates))) - .map_err(ProviderError::from)? - } else { - let hashed_state = HashedPostState::from_bundle_state( - &initial_execution_outcome.current_state().state, - ); - let state_root = provider.state_root(hashed_state)?; - (state_root, None) - }; - if block.state_root != state_root { - return Err(ConsensusError::BodyStateRootDiff( - GotExpected { got: state_root, expected: block.state_root }.into(), - ) - .into()) - } + // if block_validation_kind.is_exhaustive() { + // // calculate and check state root + // let start = Instant::now(); + // let (state_root, trie_updates) = if block_attachment.is_canonical() { + // // TODO(Cecilie): refactor the bundle state provider for cross-chain bundles + // let mut execution_outcome = + // provider.block_execution_data_provider.execution_outcome().clone(); + // execution_outcome.chain_id = chain_id; + // execution_outcome.extend(initial_execution_outcome.clone()); + // let hashed_state = execution_outcome.hash_state_slow(); + // ParallelStateRoot::new(consistent_view, hashed_state) + // .incremental_root_with_updates() + // .map(|(root, updates)| (root, Some(updates))) + // .map_err(ProviderError::from)? + // } else { + // let hashed_state = HashedPostState::from_bundle_state( + // &initial_execution_outcome.current_state().state, + // ); + // let state_root = provider.state_root(hashed_state)?; + // (state_root, None) + // }; + // if block.state_root != state_root { + // return Err(ConsensusError::BodyStateRootDiff( + // GotExpected { got: state_root, expected: block.state_root }.into(), + // ) + // .into()) + // } - tracing::debug!( - target: "blockchain_tree::chain", - number = block.number, - hash = %block_hash, - elapsed = ?start.elapsed(), - "Validated state root" - ); + // tracing::debug!( + // target: "blockchain_tree::chain", + // number = block.number, + // hash = %block_hash, + // elapsed = ?start.elapsed(), + // "Validated state root" + // ); - Ok((initial_execution_outcome, trie_updates)) - } else { + // Ok((initial_execution_outcome, trie_updates)) + // } else { Ok((initial_execution_outcome, None)) - } + //} } /// Validate and execute the given block, and append it to this chain. @@ -304,6 +361,7 @@ impl AppendableChain { canonical_fork, }; + println!("Brecht: append_block"); let (block_state, _) = Self::validate_and_execute( block.clone(), parent_block, diff --git a/crates/gwyneth/src/exex.rs b/crates/gwyneth/src/exex.rs index 704ff03855c8..8dd69670fa61 100644 --- a/crates/gwyneth/src/exex.rs +++ b/crates/gwyneth/src/exex.rs @@ -14,7 +14,7 @@ use reth_evm_ethereum::EthEvmConfig; use reth_execution_types::Chain; use reth_exex::{ExExContext, ExExEvent}; use reth_node_api::{FullNodeTypesAdapter, PayloadBuilderAttributes}; -use reth_node_builder::{components::Components, FullNode, NodeAdapter}; +use reth_node_builder::{components::Components, FullNode, Node, NodeAdapter}; use reth_node_ethereum::{node::EthereumAddOns, EthExecutorProvider}; use reth_payload_builder::EthBuiltPayload; use reth_primitives::{ @@ -38,19 +38,19 @@ pub type GwynethFullNode = FullNode< NodeAdapter< FullNodeTypesAdapter< GwynethNode, - Arc>, - BlockchainProvider>>, + Arc, + BlockchainProvider>, >, Components< FullNodeTypesAdapter< GwynethNode, - Arc>, - BlockchainProvider>>, + Arc, + BlockchainProvider>, >, Pool< TransactionValidationTaskExecutor< EthTransactionValidator< - BlockchainProvider>>, + BlockchainProvider>, EthPooledTransaction, >, >, @@ -157,7 +157,9 @@ impl Rollup { // Add all other L2 dbs for now as well until dependencies are broken for node in self.nodes.iter() { let chain_id = node.config.chain.chain().id(); + println!("other chain_id: {}", chain_id); if chain_id != node_chain_id { + println!("Adding chain_id: {}", chain_id); let state_provider = node .provider .database_provider_ro() diff --git a/crates/node/builder/src/builder/mod.rs b/crates/node/builder/src/builder/mod.rs index 1d993352e7ad..ee6d60bf44e2 100644 --- a/crates/node/builder/src/builder/mod.rs +++ b/crates/node/builder/src/builder/mod.rs @@ -5,6 +5,7 @@ pub mod add_ons; mod states; +use reth_db::mdbx::DatabaseArguments; use reth_rpc_types::WithOtherFields; pub use states::*; @@ -181,7 +182,7 @@ impl NodeBuilder { mut self, task_executor: TaskExecutor, chain_id: u64, - ) -> WithLaunchContext>>> + ) -> WithLaunchContext>> { let folder_name = format!("/data/reth/gwyneth-{}/", chain_id); let path = reth_node_core::dirs::MaybePlatformPath::::from( @@ -202,7 +203,7 @@ impl NodeBuilder { println!("data_dir: {:?}", data_dir); - let db = reth_db::test_utils::create_test_rw_db_with_path(data_dir.db()); + let db = Arc::new(reth_db::init_db(data_dir.db(), DatabaseArguments::default()).unwrap()); WithLaunchContext { builder: self.with_database(db), task_executor } } diff --git a/crates/rpc/rpc-eth-api/src/helpers/call.rs b/crates/rpc/rpc-eth-api/src/helpers/call.rs index 609879ff3037..bddebce9ec45 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/call.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/call.rs @@ -2,6 +2,7 @@ //! methods. use core::sync; +use std::collections::HashMap; use crate::{AsEthApiError, FromEthApiError, FromEvmError, IntoEthApiError}; use futures::{io::Chain, Future}; @@ -17,7 +18,7 @@ use reth_primitives::{ }; use reth_primitives::constants::{BASE_CHAIN_ID, NUM_L2_CHAINS, L1_CHAIN_ID}; -use reth_provider::{ChainSpecProvider, StateProvider}; +use reth_provider::{BlockNumReader, ChainSpecProvider, DatabaseProviderFactory, StateProvider, NODES}; use reth_revm::{ database::{CachedDBSyncStateProvider, StateProviderDatabase, SyncStateProviderDatabase}, db::CacheDB, @@ -600,10 +601,34 @@ pub trait Call: LoadState + SpawnBlocking { // Configure the evm env let mut env = self.build_call_evm_env(cfg, block, request)?; // FIX(Cecilia): hack to get the write db - let mut sync_db = CachedDBSyncStateProvider::new(SyncStateProviderDatabase::new( - Some(chain_id), - StateProviderDatabase::new(state), - )); + // Brecht + //let boxed: Box = Box::new(StateProviderDatabase::new(state)); + //let mut super_db = SyncStateProviderDatabase::new( + // Some(chain_id), + // boxed, + //); + + let mut super_db = SyncStateProviderDatabase { 0: HashMap::default() }; + + let providers = NODES.lock().unwrap(); + for (&chain_id, chain_provider) in providers.iter() { + println!("Brecht executed: Adding db for chain_id: {}", chain_id); + + let state_provider = chain_provider + .database_provider_ro() + .unwrap(); + let last_block_number = state_provider.last_block_number().unwrap(); + let state_provider = state_provider.state_provider_by_block_number(last_block_number).unwrap(); + + //let chain_provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); + //chain_providers.push(chain_provider); + + //let boxed: Box = Box::new(state_provider); + //let state_provider = StateProviderDatabase::new(boxed); + super_db.add_db(chain_id, StateProviderDatabase::new(state_provider)); + } + + let mut sync_db = CachedDBSyncStateProvider::new(super_db); // Apply any state overrides if specified. if let Some(state_override) = state_override { diff --git a/crates/storage/provider/src/lib.rs b/crates/storage/provider/src/lib.rs index 894a41620c52..672c9e31fa01 100644 --- a/crates/storage/provider/src/lib.rs +++ b/crates/storage/provider/src/lib.rs @@ -14,6 +14,11 @@ /// Various provider traits. mod traits; +use std::{collections::HashMap, sync::{Arc, LazyLock}}; + +use providers::BlockchainProvider; +use reth_db::{test_utils::TempDatabase, DatabaseEnv}; +use std::sync::Mutex; pub use traits::*; /// Provider trait implementations. @@ -61,3 +66,13 @@ pub(crate) fn to_range>(bounds: R) -> std::ops::Ra start..end } + +/// All chain providers being synced in this node +// pub static NODES: LazyLock>>> = LazyLock::new(|| Mutex::new(HashMap::new())); +// pub static NODES: LazyLock>>>>>> = LazyLock::new(|| Mutex::new(HashMap::new())); + + +pub static NODES: LazyLock>>>> = LazyLock::new(|| Mutex::new(HashMap::new())); +//pub static NODES: LazyLock>>>> = LazyLock::new(|| Mutex::new(HashMap::new())); + +// pub static NODES: LazyLock>>>>>> = LazyLock::new(|| Mutex::new(HashMap::new())); \ No newline at end of file diff --git a/crates/storage/provider/src/providers/mod.rs b/crates/storage/provider/src/providers/mod.rs index 3b85a80865e5..0860dba0696e 100644 --- a/crates/storage/provider/src/providers/mod.rs +++ b/crates/storage/provider/src/providers/mod.rs @@ -70,7 +70,7 @@ pub use blockchain_provider::BlockchainProvider2; #[allow(missing_debug_implementations)] pub struct BlockchainProvider { /// Provider type used to access the database. - database: ProviderFactory, + pub database: ProviderFactory, /// The blockchain tree instance. tree: Arc, /// Tracks the chain info wrt forkchoice updates diff --git a/packages/protocol/scripts/xTransfer.s.sol b/packages/protocol/scripts/xTransfer.s.sol index a56f913ecf3c..fdeacc02ead3 100644 --- a/packages/protocol/scripts/xTransfer.s.sol +++ b/packages/protocol/scripts/xTransfer.s.sol @@ -25,7 +25,7 @@ contract XTransfer is Script { vm.startBroadcast(ALICE_PK); // Transfer 666 tokens to Bob on L2B (chainId: 167011) - xERC20(TOKEN_ADDRESS).xTransfer(167010, BOB, 666); + xERC20(TOKEN_ADDRESS).xTransfer(167011, BOB, 666); vm.stopBroadcast(); From b83022fe795e36884dfbf5ad011d5ac221e238da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Keszey=20D=C3=A1niel?= Date: Fri, 20 Dec 2024 13:10:19 +0100 Subject: [PATCH 15/24] script for checking on-chain balances --- .../check_xchain_balances.py | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py diff --git a/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py b/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py new file mode 100644 index 000000000000..2e16b3df106f --- /dev/null +++ b/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py @@ -0,0 +1,81 @@ +from web3 import Web3 + +# Connect to the blockchain +RPC_URL_A = "http://127.0.0.1:32005" # Replace with your RPC URL +web3_l2a = Web3(Web3.HTTPProvider(RPC_URL_A)) +RPC_URL_B = "http://127.0.0.1:32006" # Replace with your RPC URL +web3_l2b = Web3(Web3.HTTPProvider(RPC_URL_B)) + +def simulate_blockchain_call(contract_address, abi, function_name, *args): + + # Load the contract + contract_a = web3_l2a.eth.contract(address=web3_l2a.to_checksum_address(contract_address), abi=abi) + contract_b = web3_l2b.eth.contract(address=web3_l2b.to_checksum_address(contract_address), abi=abi) + + # Get the contract function + contract_a_function = getattr(contract_a.functions, function_name)(*args) + contract_b_function = getattr(contract_b.functions, function_name)(*args) + + # Simulate the call + try: + response = contract_a_function.call() + print(f"Blockchain call successful. Response, from L2A: {response}") + except Exception as e: + print(f"Error during blockchain call: {e}") + + try: + response = contract_b_function.call() + print(f"Blockchain call successful. Response, from L2B: {response}") + except Exception as e: + print(f"Error during blockchain call: {e}") + +if __name__ == "__main__": + # a simple ERC20 + example_contract_address = "0x5FbDB2315678afecb367f032d93F642f64180aa3" # xTransfer + example_abi = [ + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "constant": True, + "inputs": [ + {"name": "", "type": "address"} + ], + "name": "balanceOf", + "outputs": [ + {"name": "", "type": "uint256"} + ], + "payable": False, + "stateMutability": "view", + "type": "function" + } + ] + + # Simulate the blockchain call + print("Alice balance:") + simulate_blockchain_call(example_contract_address, example_abi, "balanceOf", "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266") + print("Bob balance:") + simulate_blockchain_call(example_contract_address, example_abi, "balanceOf", "0x70997970C51812dc3A010C7d01b50e0d17dc79C8") \ No newline at end of file From 0343701bb62c65e838358ba48eb26fb8815b3b18 Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Mon, 30 Dec 2024 19:17:59 +0100 Subject: [PATCH 16/24] sync composability with state diffs wip --- Cargo.lock | 15 +- Cargo.toml | 10 +- crates/blockchain-tree/Cargo.toml | 2 + crates/blockchain-tree/src/blockchain_tree.rs | 143 +++++++----------- crates/blockchain-tree/src/chain.rs | 127 ++++++++++------ crates/consensus/common/src/validation.rs | 14 +- crates/evm/execution-types/src/lib.rs | 3 + crates/evm/execution-types/src/state_diff.rs | 87 +++++++++++ crates/gwyneth/src/builder.rs | 65 ++++++-- crates/gwyneth/src/exex.rs | 53 +++++-- crates/primitives/Cargo.toml | 3 + crates/primitives/src/block.rs | 77 +++++++++- crates/primitives/src/lib.rs | 2 +- .../rpc-types-compat/src/engine/payload.rs | 7 +- packages/protocol/contracts/L1/TaikoData.sol | 17 +++ packages/protocol/contracts/L1/TaikoL1.sol | 7 + .../protocol/contracts/examples/xERC20.sol | 3 +- .../contracts/gwyneth/GwynethContract.sol | 24 +++ .../protocol/scripts/DeployL1Locally.s.sol | 5 + .../protocol/scripts/deploy_and_xtransfer.sh | 37 ++++- 20 files changed, 512 insertions(+), 189 deletions(-) create mode 100644 crates/evm/execution-types/src/state_diff.rs create mode 100644 packages/protocol/contracts/gwyneth/GwynethContract.sol diff --git a/Cargo.lock b/Cargo.lock index 92a47212ea70..c995eb7c6fc0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4554,7 +4554,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -6544,6 +6544,8 @@ dependencies = [ "reth-trie", "reth-trie-db", "reth-trie-parallel", + "serde", + "serde_json", "tokio", "tracing", ] @@ -8217,6 +8219,7 @@ dependencies = [ "reth-primitives-traits", "reth-static-file-types", "reth-trie-common", + "revm", "revm-primitives", "secp256k1", "serde", @@ -9032,7 +9035,7 @@ dependencies = [ [[package]] name = "revm" version = "14.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#a7dfafe54b4f6b8f858e7fdb4e7cf4ac373310d7" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#f74ba0aeceafaea49a07bf2bf56d425da8e1f48b" dependencies = [ "auto_impl", "cfg-if", @@ -9064,7 +9067,7 @@ dependencies = [ [[package]] name = "revm-interpreter" version = "10.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#a7dfafe54b4f6b8f858e7fdb4e7cf4ac373310d7" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#f74ba0aeceafaea49a07bf2bf56d425da8e1f48b" dependencies = [ "revm-primitives", "serde", @@ -9073,7 +9076,7 @@ dependencies = [ [[package]] name = "revm-precompile" version = "11.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#a7dfafe54b4f6b8f858e7fdb4e7cf4ac373310d7" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#f74ba0aeceafaea49a07bf2bf56d425da8e1f48b" dependencies = [ "aurora-engine-modexp", "blst", @@ -9092,7 +9095,7 @@ dependencies = [ [[package]] name = "revm-primitives" version = "9.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#a7dfafe54b4f6b8f858e7fdb4e7cf4ac373310d7" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#f74ba0aeceafaea49a07bf2bf56d425da8e1f48b" dependencies = [ "alloy-eips", "alloy-primitives 0.8.14", @@ -11208,7 +11211,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 910e07ff49de..8f258d1505f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -563,12 +563,18 @@ proptest-derive = "0.5" serial_test = "3" similar-asserts = "1.5.0" tempfile = "3.8" -test-fuzz = "5" +test-fuzz = "5" [patch.crates-io] revm = { git = "https://github.com/taikoxyz/revm.git", branch = "gwyneth-debug-shit" } revm-primitives = { git = "https://github.com/taikoxyz/revm.git", branch = "gwyneth-debug-shit" } revm-interpreter = { git = "https://github.com/taikoxyz/revm.git", branch = "gwyneth-debug-shit" } revm-precompile = { git = "https://github.com/taikoxyz/revm.git", branch = "gwyneth-debug-shit" } + +#revm = { path = "../../revm-gwyneth/revm/crates/revm" } +#revm-primitives = { path = "../../revm-gwyneth/revm/crates/primitives" } +#revm-interpreter = { path = "../../revm-gwyneth/revm/crates/interpreter" } +#revm-precompile = { path = "../../revm-gwyneth/revm/crates/precompile" } + revm-inspectors = { git = "https://github.com/taikoxyz/revm-inspectors.git", branch = "main-rbuilder" } -# local patches trial-errors: revm-inspectors = { path = "../../revm-inspectors/revm-inspectors"} \ No newline at end of file +#revm-inspectors = { path = "../../revm-inspector-gwyneth/revm-inspectors"} \ No newline at end of file diff --git a/crates/blockchain-tree/Cargo.toml b/crates/blockchain-tree/Cargo.toml index 988bb54e8580..4044675cb060 100644 --- a/crates/blockchain-tree/Cargo.toml +++ b/crates/blockchain-tree/Cargo.toml @@ -42,6 +42,8 @@ metrics.workspace = true # misc aquamarine.workspace = true linked_hash_set.workspace = true +serde.workspace = true +serde_json.workspace = true [dev-dependencies] reth-chainspec.workspace = true diff --git a/crates/blockchain-tree/src/blockchain_tree.rs b/crates/blockchain-tree/src/blockchain_tree.rs index fd8bda3cd5cd..0536ac7b8d3c 100644 --- a/crates/blockchain-tree/src/blockchain_tree.rs +++ b/crates/blockchain-tree/src/blockchain_tree.rs @@ -1225,100 +1225,63 @@ where ) -> Result<(), CanonicalError> { // Brecht reorg state trie calculation let (blocks, state, chain_trie_updates) = chain.into_inner(); - //let hashed_state = state.hash_state_slow(); - //let prefix_sets = hashed_state.construct_prefix_sets().freeze(); - //let hashed_state_sorted = hashed_state.into_sorted(); - - let providers = NODES.lock().unwrap(); - - for (&chain_id, provider) in providers.iter() { - let state = state.filter_chain(chain_id); - if state.bundle.is_empty() { - continue; + let hashed_state = state.hash_state_slow(); + let prefix_sets = hashed_state.construct_prefix_sets().freeze(); + let hashed_state_sorted = hashed_state.into_sorted(); + + // Compute state root or retrieve cached trie updates before opening write transaction. + let block_hash_numbers = + blocks.iter().map(|(number, b)| (number, b.hash())).collect::>(); + let trie_updates = match chain_trie_updates { + Some(updates) => { + debug!(target: "blockchain_tree", blocks = ?block_hash_numbers, "Using cached trie updates"); + self.metrics.trie_updates_insert_cached.increment(1); + updates } - - println!("applying state to: {}", chain_id); - - let hashed_state = state.hash_state_slow(); - let prefix_sets = hashed_state.construct_prefix_sets().freeze(); - let hashed_state_sorted = hashed_state.into_sorted(); - - // Compute state root or retrieve cached trie updates before opening write transaction. - //let block_hash_numbers = - // blocks.iter().map(|(number, b)| (number, b.hash())).collect::>(); - let trie_updates = match chain_trie_updates.clone() { - Some(updates) => { - //debug!(target: "blockchain_tree", blocks = ?block_hash_numbers, "Using cached trie updates"); - self.metrics.trie_updates_insert_cached.increment(1); - updates - } - None => { - //debug!(target: "blockchain_tree", blocks = ?block_hash_numbers, "Recomputing state root for insert"); - let provider = self - .externals - .provider_factory - .provider()? - // State root calculation can take a while, and we're sure no write transaction - // will be open in parallel. See https://github.com/paradigmxyz/reth/issues/6168. - .disable_long_read_transaction_safety(); - - let (state_root, trie_updates) = StateRoot::from_tx(provider.tx_ref()) - .with_hashed_cursor_factory(HashedPostStateCursorFactory::new( - DatabaseHashedCursorFactory::new(provider.tx_ref()), - &hashed_state_sorted.clone(), - )) - .with_prefix_sets(prefix_sets) - .root_with_updates() - .map_err(Into::::into)?; - // let tip = blocks.tip(); - // if state_root != tip.state_root { - // return Err(ProviderError::StateRootMismatch(Box::new(RootMismatch { - // root: GotExpected { got: state_root, expected: tip.state_root }, - // block_number: tip.number, - // block_hash: tip.hash(), - // })) - // .into()) - // } - self.metrics.trie_updates_insert_recomputed.increment(1); - trie_updates + None => { + debug!(target: "blockchain_tree", blocks = ?block_hash_numbers, "Recomputing state root for insert"); + let provider = self + .externals + .provider_factory + .provider()? + // State root calculation can take a while, and we're sure no write transaction + // will be open in parallel. See https://github.com/paradigmxyz/reth/issues/6168. + .disable_long_read_transaction_safety(); + let (state_root, trie_updates) = StateRoot::from_tx(provider.tx_ref()) + .with_hashed_cursor_factory(HashedPostStateCursorFactory::new( + DatabaseHashedCursorFactory::new(provider.tx_ref()), + &hashed_state_sorted, + )) + .with_prefix_sets(prefix_sets) + .root_with_updates() + .map_err(Into::::into)?; + let tip = blocks.tip(); + if state_root != tip.state_root { + return Err(ProviderError::StateRootMismatch(Box::new(RootMismatch { + root: GotExpected { got: state_root, expected: tip.state_root }, + block_number: tip.number, + block_hash: tip.hash(), + })) + .into()) } - }; - recorder.record_relative(MakeCanonicalAction::RetrieveStateTrieUpdates); - - println!("bbb: commit_canonical_to_database"); - //let provider_rw = self.externals.provider_factory.provider_rw()?; - let provider_rw = provider.database.provider_rw()?; - provider_rw - .append_blocks_with_state( - blocks.clone().into_blocks().collect(), - state, - hashed_state_sorted, - trie_updates, - ) - .map_err(|e| CanonicalError::CanonicalCommit(e.to_string()))?; - - provider_rw.commit()?; - recorder.record_relative(MakeCanonicalAction::CommitCanonicalChainToDatabase); - } + self.metrics.trie_updates_insert_recomputed.increment(1); + trie_updates + } + }; + recorder.record_relative(MakeCanonicalAction::RetrieveStateTrieUpdates); - Ok(()) - } + let provider_rw = self.externals.provider_factory.provider_rw()?; + provider_rw + .append_blocks_with_state( + blocks.into_blocks().collect(), + state, + hashed_state_sorted, + trie_updates, + ) + .map_err(|e| CanonicalError::CanonicalCommit(e.to_string()))?; - /// Unwind tables and put it inside state - pub fn unwind(&mut self, unwind_to: BlockNumber) -> Result<(), CanonicalError> { - // nothing to be done if unwind_to is higher then the tip - if self.block_indices().canonical_tip().number <= unwind_to { - return Ok(()) - } - // revert `N` blocks from current canonical chain and put them inside BlockchainTree - let old_canon_chain = self.revert_canonical_from_database(unwind_to)?; - - // check if there is block in chain - if let Some(old_canon_chain) = old_canon_chain { - self.state.block_indices.unwind_canonical_chain(unwind_to); - // insert old canonical chain to BlockchainTree. - self.insert_unwound_chain(AppendableChain::new(old_canon_chain)); - } + provider_rw.commit()?; + recorder.record_relative(MakeCanonicalAction::CommitCanonicalChainToDatabase); Ok(()) } diff --git a/crates/blockchain-tree/src/chain.rs b/crates/blockchain-tree/src/chain.rs index 9adc92f4e510..de7392d71fea 100644 --- a/crates/blockchain-tree/src/chain.rs +++ b/crates/blockchain-tree/src/chain.rs @@ -28,6 +28,7 @@ use std::{ ops::{Deref, DerefMut}, time::Instant, }; +use reth_execution_types::state_diff_to_block_execution_output; /// A chain in the blockchain tree that has functionality to execute blocks and append them to /// itself. @@ -254,7 +255,9 @@ impl AppendableChain { let state_provider = chain_provider .database_provider_ro() .unwrap(); - let last_block_number = state_provider.last_block_number()?; + //let last_block_number = state_provider.last_block_number()?; + let last_block_number = block.number - 1; + println!("[{}-{}] Executing against block {} {}", externals.provider_factory.chain_spec().chain.id(), block.number, chain_id, last_block_number); let state_provider = state_provider.state_provider_by_block_number(last_block_number).unwrap(); //let chain_provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); @@ -265,59 +268,95 @@ impl AppendableChain { super_db.add_db(chain_id, StateProviderDatabase::new(state_provider)); } - let executor = externals.executor_factory.executor(super_db); + let block_number = block.number; let block_hash = block.hash(); - let block = block.unseal(); - let state = executor.execute((&block, U256::MAX).into())?; - externals.consensus.validate_block_post_execution( - &block, - PostExecutionInput::new(&state.receipts, &state.requests), - )?; + println!("Block extra data: {:?}", block.extra_data); + let state_diff = if block.extra_data.len() > 32 { + println!("Decoding extra data..."); + let json_str = String::from_utf8(block.extra_data.to_vec()).unwrap(); + let state_diff = serde_json::from_str(&json_str).unwrap_or(None); + state_diff + } else { + None + }; + + println!("Applying block update: {:?}", state_diff); let chain_id = externals.provider_factory.chain_spec().chain.id(); - let initial_execution_outcome = ExecutionOutcome::from((state, chain_id, block.number)); + let state = if let Some(state_diff) = &state_diff { + println!("Applying state from diff"); + + let block = block.unseal(); + let executor = externals.executor_factory.executor(super_db); + let state_execution = executor.execute((&block, U256::MAX).into())?; + + let state_diff = state_diff_to_block_execution_output(chain_id, state_diff); + + println!("ori: {:?}", state_execution); + println!("new: {:?}", state_diff); + + let execution_outcome_execution = ExecutionOutcome::from((state_execution.clone(), chain_id, block_number)).filter_chain(chain_id); + let execution_outcome_diff = ExecutionOutcome::from((state_diff, chain_id, block_number)).filter_chain(chain_id); + + let hashed_state_execution = execution_outcome_execution.hash_state_slow(); + let hashed_state_diff = execution_outcome_diff.hash_state_slow(); + assert_eq!(hashed_state_execution, hashed_state_diff, "state diff incorrect"); + + state_execution + } else { + println!("Applying state from transactions"); + let block = block.unseal(); + let executor = externals.executor_factory.executor(super_db); + let state = executor.execute((&block, U256::MAX).into())?; + state + // externals.consensus.validate_block_post_execution( + // &block, + // PostExecutionInput::new(&state.receipts, &state.requests), + // )?; + }; - //let initial_execution_outcome = initial_execution_outcome.filter_chain(externals.provider_factory.chain_spec().chain.id()); + let initial_execution_outcome = ExecutionOutcome::from((state, chain_id, block_number)); + let initial_execution_outcome = initial_execution_outcome.filter_chain(chain_id); // check state root if the block extends the canonical chain __and__ if state root // validation was requested. // if block_validation_kind.is_exhaustive() { - // // calculate and check state root - // let start = Instant::now(); - // let (state_root, trie_updates) = if block_attachment.is_canonical() { - // // TODO(Cecilie): refactor the bundle state provider for cross-chain bundles - // let mut execution_outcome = - // provider.block_execution_data_provider.execution_outcome().clone(); - // execution_outcome.chain_id = chain_id; - // execution_outcome.extend(initial_execution_outcome.clone()); - // let hashed_state = execution_outcome.hash_state_slow(); - // ParallelStateRoot::new(consistent_view, hashed_state) - // .incremental_root_with_updates() - // .map(|(root, updates)| (root, Some(updates))) - // .map_err(ProviderError::from)? - // } else { - // let hashed_state = HashedPostState::from_bundle_state( - // &initial_execution_outcome.current_state().state, - // ); - // let state_root = provider.state_root(hashed_state)?; - // (state_root, None) - // }; - // if block.state_root != state_root { - // return Err(ConsensusError::BodyStateRootDiff( - // GotExpected { got: state_root, expected: block.state_root }.into(), - // ) - // .into()) - // } - - // tracing::debug!( - // target: "blockchain_tree::chain", - // number = block.number, - // hash = %block_hash, - // elapsed = ?start.elapsed(), - // "Validated state root" - // ); + // calculate and check state root + // let start = Instant::now(); + // let (state_root, trie_updates) = if block_attachment.is_canonical() { + // // TODO(Cecilie): refactor the bundle state provider for cross-chain bundles + // let mut execution_outcome = + // provider.block_execution_data_provider.execution_outcome().clone(); + // execution_outcome.chain_id = chain_id; + // execution_outcome.extend(initial_execution_outcome.clone()); + // let hashed_state = execution_outcome.hash_state_slow(); + // ParallelStateRoot::new(consistent_view, hashed_state) + // .incremental_root_with_updates() + // .map(|(root, updates)| (root, Some(updates))) + // .map_err(ProviderError::from)? + // } else { + // let hashed_state = HashedPostState::from_bundle_state( + // &initial_execution_outcome.current_state().state, + // ); + // let state_root = provider.state_root(hashed_state)?; + // (state_root, None) + // }; + // if block.state_root != state_root { + // return Err(ConsensusError::BodyStateRootDiff( + // GotExpected { got: state_root, expected: block.state_root }.into(), + // ) + // .into()) + // } + + // tracing::debug!( + // target: "blockchain_tree::chain", + // number = block.number, + // hash = %block_hash, + // elapsed = ?start.elapsed(), + // "Validated state root" + // ); // Ok((initial_execution_outcome, trie_updates)) // } else { diff --git a/crates/consensus/common/src/validation.rs b/crates/consensus/common/src/validation.rs index f3654c42ee2c..b4354c9c29be 100644 --- a/crates/consensus/common/src/validation.rs +++ b/crates/consensus/common/src/validation.rs @@ -182,12 +182,14 @@ pub fn validate_4844_header_standalone(header: &Header) -> Result<(), ConsensusE /// This must be 32 bytes or fewer; formally Hx. #[inline] pub fn validate_header_extradata(header: &Header) -> Result<(), ConsensusError> { - let extradata_len = header.extra_data.len(); - if extradata_len > MAXIMUM_EXTRA_DATA_SIZE { - Err(ConsensusError::ExtraDataExceedsMax { len: extradata_len }) - } else { - Ok(()) - } + // TODO(Brecht) + // let extradata_len = header.extra_data.len(); + // if extradata_len > MAXIMUM_EXTRA_DATA_SIZE { + // Err(ConsensusError::ExtraDataExceedsMax { len: extradata_len }) + // } else { + // Ok(()) + // } + Ok(()) } /// Validates against the parent hash and number. diff --git a/crates/evm/execution-types/src/lib.rs b/crates/evm/execution-types/src/lib.rs index 86abd98de1d9..dff73320a641 100644 --- a/crates/evm/execution-types/src/lib.rs +++ b/crates/evm/execution-types/src/lib.rs @@ -19,3 +19,6 @@ pub use execute::*; mod execution_outcome; pub use execution_outcome::*; + +mod state_diff; +pub use state_diff::*; diff --git a/crates/evm/execution-types/src/state_diff.rs b/crates/evm/execution-types/src/state_diff.rs new file mode 100644 index 000000000000..635d18a3f4bf --- /dev/null +++ b/crates/evm/execution-types/src/state_diff.rs @@ -0,0 +1,87 @@ +use std::collections::HashMap; + +use reth_primitives::{ + StateDiff, StateDiffAccount, StateDiffStorageSlot, + constants::{eip4844::MAX_DATA_GAS_PER_BLOCK, BEACON_NONCE}, eip4844::calculate_excess_blob_gas, proofs::{self, calculate_requests_root}, Block, BlockNumber, ChainId, EthereumHardforks, Header, Receipt, Receipts, Requests, TransactionSigned, EMPTY_OMMER_ROOT_HASH, U256 +}; +//use reth_provider::{StateProvider, StateProviderFactory}; +//use reth_revm::database::{StateProviderDatabase, SyncStateProviderDatabase}; +//use reth_transaction_pool::{BestTransactionsAttributes, TransactionPool}; +use revm::{ + db::{states::bundle_state::BundleRetention, BundleAccount, BundleState, State}, + primitives::{AccountInfo, Bytecode, EVMError, EnvWithHandlerCfg, ResultAndState}, + DatabaseCommit, SyncDatabase, +}; + +use revm::primitives::ChainAddress; +use revm::db::AccountStatus; +use revm::db::states::StorageSlot; + +use crate::{BlockExecutionOutput, ExecutionOutcome}; + + +pub fn execution_outcome_to_state_diff(execution_outcome: &ExecutionOutcome) -> StateDiff { + assert_eq!(execution_outcome.receipts().len(), 1); + let receipts = execution_outcome.receipts()[0].iter().map(|r| r.clone().unwrap()).collect(); + to_state_diff(&execution_outcome.bundle, &receipts) +} + +pub fn block_execution_output_to_state_diff(block_execution_output: &BlockExecutionOutput) -> StateDiff { + to_state_diff(&block_execution_output.state, &block_execution_output.receipts) +} + +pub fn to_state_diff(bundle_state: &BundleState, receipts: &Vec) -> StateDiff { + let mut state_diff = StateDiff { + accounts: Vec::new(), + receipts: receipts.clone(), + }; + for (address, bundle_account) in bundle_state.state.iter() { + let storage = bundle_account.storage.iter().map(|(&key, value)| StateDiffStorageSlot { + key, value: value.present_value + }).collect(); + + let account_info = bundle_account.account_info().unwrap_or_default(); + let state_diff_account = StateDiffAccount { + address: address.1, + storage, + balance: account_info.balance, + nonce: account_info.nonce, + code_hash: account_info.code_hash, + code: account_info.code.unwrap_or_default().bytes(), + }; + state_diff.accounts.push(state_diff_account); + } + state_diff +} + +pub fn state_diff_to_block_execution_output(chain_id: u64, state_diff: &StateDiff) -> BlockExecutionOutput { + let mut block_execution_output = BlockExecutionOutput:: { + state: BundleState::default(), + receipts: state_diff.receipts.clone(), + requests: Vec::new(), + gas_used: 0, + }; + for account in state_diff.accounts.iter() { + + let mut new_account = BundleAccount { + info: Some(AccountInfo { + balance: account.balance, + nonce: account.nonce, + code_hash: account.code_hash, + code: Some(Bytecode::new_raw_checked(account.code.clone()).unwrap()), + }), + original_info: None, + storage: HashMap::new(), + status: AccountStatus::Changed, + }; + for storage_slot in account.storage.iter() { + new_account.storage.insert(storage_slot.key, StorageSlot { + previous_or_original_value: storage_slot.value, + present_value: storage_slot.value, + }); + } + + block_execution_output.state.state.insert(ChainAddress(chain_id, account.address), new_account); + } + block_execution_output +} diff --git a/crates/gwyneth/src/builder.rs b/crates/gwyneth/src/builder.rs index 714245e2178d..0cbb9dc107f1 100644 --- a/crates/gwyneth/src/builder.rs +++ b/crates/gwyneth/src/builder.rs @@ -12,6 +12,7 @@ use reth_basic_payload_builder::{ }; use reth_errors::RethError; use reth_evm::{ + execute::BlockExecutionOutput, system_calls::{ post_block_withdrawal_requests_contract_call, pre_block_beacon_root_contract_call, pre_block_blockhashes_contract_call, @@ -26,23 +27,28 @@ use reth_payload_builder::{ EthBuiltPayload, }; use reth_primitives::{ - constants::{eip4844::MAX_DATA_GAS_PER_BLOCK, BEACON_NONCE}, - eip4844::calculate_excess_blob_gas, - proofs::{self, calculate_requests_root}, - Block, BlockNumber, ChainId, EthereumHardforks, Header, Receipt, Receipts, Requests, - EMPTY_OMMER_ROOT_HASH, U256, + StateDiff, StateDiffAccount, StateDiffStorageSlot, + constants::{eip4844::MAX_DATA_GAS_PER_BLOCK, BEACON_NONCE}, eip4844::calculate_excess_blob_gas, proofs::{self, calculate_requests_root}, Block, BlockNumber, ChainId, EthereumHardforks, Header, Receipt, Receipts, Requests, TransactionSigned, EMPTY_OMMER_ROOT_HASH, U256 }; use reth_provider::{StateProvider, StateProviderFactory}; use reth_revm::database::{StateProviderDatabase, SyncStateProviderDatabase}; use reth_transaction_pool::{BestTransactionsAttributes, TransactionPool}; use reth_trie::HashedPostState; use revm::{ - db::{states::bundle_state::BundleRetention, BundleState, State}, + db::{states::bundle_state::BundleRetention, BundleAccount, BundleState, State}, primitives::{EVMError, EnvWithHandlerCfg, ResultAndState}, DatabaseCommit, SyncDatabase, }; use tracing::{debug, trace, warn}; +use reth_revm::primitives::ChainAddress; +use reth_revm::db::AccountStatus; +use reth_revm::db::states::StorageSlot; + +use reth_execution_types::execution_outcome_to_state_diff; + +use reth_primitives::alloy_primitives::Bytes; + use crate::GwynethPayloadBuilderAttributes; /// Constructs an Ethereum transaction payload using the best transactions from the pool. @@ -77,12 +83,15 @@ where .. } = config; + println!("Build 1"); + let state_provider = client.state_by_block_hash(parent_block.hash())?; let state = StateProviderDatabase::new(state_provider); let mut sync_state = SyncStateProviderDatabase::new(Some(chain_spec.chain().id()), state); // Add all external state dependencies for (&chain_id, provider) in attributes.providers.iter() { + println!("Adding db for chain_id: {}", chain_id); let boxed: Box = Box::new(provider); let state_provider = StateProviderDatabase::new(boxed); sync_state.add_db(chain_id, state_provider); @@ -101,7 +110,7 @@ where initialized_block_env.gas_limit.try_into().unwrap_or(chain_spec.max_gas_limit); let base_fee = initialized_block_env.basefee.to::(); - let mut executed_txs = Vec::new(); + let mut executed_txs: Vec = Vec::new(); let mut best_txs = pool.best_transactions_with_attributes(BestTransactionsAttributes::new( base_fee, @@ -144,6 +153,8 @@ where PayloadBuilderError::Internal(err.into()) })?; + println!("Build 6"); + let mut receipts = Vec::new(); for tx in &attributes.transactions { // // ensure we still have capacity for this transaction @@ -192,12 +203,15 @@ where Err(err) => { match err { EVMError::Transaction(err) => { + println!("build tx error: {:?}", err); trace!(target: "payload_builder", %err, ?tx, "Error in sequencer transaction, skipping."); continue } err => { + println!("build tx error fatal: {:?}", err); // this is an error that we should treat as fatal for this attempt - return Err(PayloadBuilderError::EvmExecutionError(err)) + //return Err(PayloadBuilderError::EvmExecutionError(err)) + continue } } } @@ -243,14 +257,16 @@ where executed_txs.push(tx.into_signed()); } + println!("{} - Build 7: {:?}", chain_spec.chain().id(), executed_txs); + // check if we have a better block - if !is_better_payload(best_payload.as_ref(), total_fees) { + // if !is_better_payload(best_payload.as_ref(), total_fees) { // can skip building the block - return Ok(BuildOutcome::Aborted { - fees: total_fees, - cached_reads: sync_cached_reads.into(), - }) - } + // return Ok(BuildOutcome::Aborted { + // fees: total_fees, + // cached_reads: sync_cached_reads.into(), + // }) + //} // calculate the requests and the requests root let (requests, requests_root) = if chain_spec @@ -292,6 +308,9 @@ where vec![requests.clone().unwrap_or_default()], ) .filter_current_chain(); + + let state_diff = execution_outcome_to_state_diff(&execution_outcome); + let receipts_root = execution_outcome.receipts_root_slow(block_number).expect("Number is in range"); let logs_bloom = execution_outcome.block_logs_bloom(block_number).expect("Number is in range"); @@ -332,6 +351,10 @@ where blob_gas_used = Some(sum_blob_gas_used); } + let json_str = serde_json::to_string(&state_diff).unwrap(); + let serialized_bytes = json_str.into_bytes(); + let extra_data = Bytes::from(serialized_bytes); + let header = Header { parent_hash: parent_block.hash(), ommers_hash: EMPTY_OMMER_ROOT_HASH, @@ -356,18 +379,28 @@ where requests_root, }; + println!("Build 15"); + // seal the block let block = Block { header, body: executed_txs, ommers: vec![], withdrawals, requests }; - let sealed_block = block.seal_slow(); + let mut sealed_block = block.seal_slow(); + //sealed_block.state_diff = Some(execution_outcome_to_state_diff(&execution_outcome)); + + println!("execution outcome: {:?}", execution_outcome); + debug!(target: "payload_builder", ?sealed_block, "sealed built block"); + total_fees = U256::from(1u64); + let mut payload = EthBuiltPayload::new(attributes.inner.id, sealed_block, total_fees); // extend the payload with the blob sidecars from the executed txs payload.extend_sidecars(blob_sidecars); - Ok(BuildOutcome::Better { payload, cached_reads: sync_cached_reads.into() }) + println!("Build 18"); + + Ok(BuildOutcome::Better { payload, cached_reads: /*sync_cached_reads.into())*/ CachedReads::default() }) } pub fn build_execution_outcome( diff --git a/crates/gwyneth/src/exex.rs b/crates/gwyneth/src/exex.rs index 8dd69670fa61..a9414f8ed4f1 100644 --- a/crates/gwyneth/src/exex.rs +++ b/crates/gwyneth/src/exex.rs @@ -1,4 +1,4 @@ -use std::{marker::PhantomData, sync::Arc}; +use std::{collections::HashMap, marker::PhantomData, sync::Arc}; use alloy_rlp::Decodable; use alloy_sol_types::{sol, SolEventInterface}; @@ -71,6 +71,7 @@ pub struct Rollup { ctx: ExExContext, nodes: Vec, engine_apis: Vec>, + num_l2_blocks: u64, } impl Rollup { @@ -84,7 +85,7 @@ impl Rollup { }; engine_apis.push(engine_api); } - Ok(Self { ctx, nodes, /* payload_event_stream, */ engine_apis }) + Ok(Self { ctx, nodes, /* payload_event_stream, */ engine_apis, num_l2_blocks: 0 }) } pub async fn start(mut self) -> eyre::Result<()> { @@ -106,6 +107,18 @@ impl Rollup { pub async fn commit(&mut self, chain: &Chain, node_idx: usize) -> eyre::Result<()> { let events = decode_chain_into_rollup_events(chain); + + // Add all other L2 dbs for now as well until dependencies are broken + // let mut last_block_number = HashMap::new(); + // for node in self.nodes.iter() { + // let chain_id = node.config.chain.chain().id(); + // let state_provider = node + // .provider + // .database_provider_ro() + // .unwrap(); + // last_block_number.insert(chain_id, state_provider.last_block_number()?); + // } + for (block, _, event) in events { if let RollupContractEvents::BlockProposed(BlockProposed { blockId: block_number, @@ -120,19 +133,21 @@ impl Rollup { let all_transactions: Vec = decode_transactions(&meta.txList); let node_chain_id = BASE_CHAIN_ID + (node_idx as u64); - let filtered_transactions: Vec = all_transactions - .into_iter() - .filter(|tx| tx.chain_id() == Some(node_chain_id)) - .collect(); + // let filtered_transactions: Vec = all_transactions + // .into_iter() + // .filter(|tx| tx.chain_id() == Some(node_chain_id)) + // .collect(); - if filtered_transactions.len() == 0 { - println!("no transactions for chain: {}", node_chain_id); - continue; - } + // if filtered_transactions.len() == 0 { + // println!("no transactions for chain: {}", node_chain_id); + // continue; + // } + + let filtered_transactions: Vec = all_transactions; let attrs = GwynethPayloadAttributes { inner: EthPayloadAttributes { - timestamp: block.timestamp, + timestamp: block.timestamp + node_idx as u64, prev_randao: B256::ZERO, suggested_fee_recipient: Address::ZERO, withdrawals: Some(vec![]), @@ -164,7 +179,11 @@ impl Rollup { .provider .database_provider_ro() .unwrap(); - let last_block_number = state_provider.last_block_number()?; + //let last_block_number = state_provider.last_block_number()?; + //let last_block_number = *last_block_number.get(&chain_id).unwrap(); + //println!("last block number: {} -> {}", chain_id, last_block_number); + let last_block_number = self.num_l2_blocks / self.nodes.len() as u64; + println!("exex executing against {}", last_block_number); let state_provider = state_provider.state_provider_by_block_number(last_block_number).unwrap(); builder_attrs.providers.insert(chain_id, Arc::new(state_provider)); @@ -175,6 +194,8 @@ impl Rollup { let parrent_beacon_block_root = builder_attrs.inner.parent_beacon_block_root.unwrap(); + println!("payload_id: {} {}", node_idx, payload_id); + // trigger new payload building draining the pool self.nodes[node_idx].payload_builder.new_payload(builder_attrs).await.unwrap(); @@ -196,13 +217,15 @@ impl Rollup { continue; } } else { - println!("Gwyneth: No block?"); + println!("Gwyneth: No block for {}?", node_chain_id); tokio::time::sleep(std::time::Duration::from_millis(100)).await; continue; } break; } + //tokio::time::sleep(std::time::Duration::from_millis(10000)).await; + // trigger resolve payload via engine api self.engine_apis[node_idx].get_payload_v3_value(payload_id).await?; @@ -218,6 +241,10 @@ impl Rollup { // trigger forkchoice update via engine api to commit the block to the blockchain self.engine_apis[node_idx].update_forkchoice(block_hash, block_hash).await?; + + println!("Done with block {}: {}", node_chain_id, payload.block().number); + + self.num_l2_blocks += 1; } } diff --git a/crates/primitives/Cargo.toml b/crates/primitives/Cargo.toml index 2da37359c023..2bb6bfbcd2f2 100644 --- a/crates/primitives/Cargo.toml +++ b/crates/primitives/Cargo.toml @@ -31,6 +31,9 @@ alloy-genesis.workspace = true alloy-eips = { workspace = true, features = ["serde"] } alloy-consensus.workspace = true +# revm +revm.workspace = true + # optimism op-alloy-rpc-types = { workspace = true, optional = true } diff --git a/crates/primitives/src/block.rs b/crates/primitives/src/block.rs index 166a43b82f5e..b458832aeb44 100644 --- a/crates/primitives/src/block.rs +++ b/crates/primitives/src/block.rs @@ -1,6 +1,5 @@ use crate::{ - Address, Bytes, GotExpected, Header, SealedHeader, TransactionSigned, - TransactionSignedEcRecovered, Withdrawals, B256, + Address, Bytes, GotExpected, Header, Receipt, SealedHeader, TransactionSigned, TransactionSignedEcRecovered, Withdrawals, B256, U256 }; pub use alloy_eips::eip1898::{ BlockHashOrNumber, BlockId, BlockNumHash, BlockNumberOrTag, ForkBlock, RpcBlockHash, @@ -12,7 +11,9 @@ use proptest::prelude::prop_compose; #[cfg(any(test, feature = "arbitrary"))] pub use reth_primitives_traits::test_utils::{generate_valid_header, valid_header_strategy}; use reth_primitives_traits::Requests; +use revm_primitives::AccountInfo; use serde::{Deserialize, Serialize}; +use revm::db::states::BundleState; #[cfg(not(feature = "std"))] use alloc::vec::Vec; @@ -268,8 +269,6 @@ impl BlockWithSenders { /// Sealed Ethereum full block. /// /// Withdrawals can be optionally included at the end of the RLP encoded message. -#[cfg_attr(any(test, feature = "arbitrary"), derive(arbitrary::Arbitrary))] -#[cfg_attr(any(test, feature = "reth-codec"), reth_codecs::add_arbitrary_tests(rlp, 32))] #[derive( Debug, Clone, @@ -299,6 +298,76 @@ pub struct SealedBlock { pub requests: Option, } +/// Sealed Ethereum full block. +/// +/// Withdrawals can be optionally included at the end of the RLP encoded message. +#[derive( + Debug, + Clone, + PartialEq, + Eq, + Default, + Serialize, + Deserialize, + RlpEncodable, + RlpDecodable, +)] +pub struct StateDiff { + /// Account state. + pub accounts: Vec, + /// Receipts + pub receipts: Vec, +} + +/// StateDiffAccount +#[derive( + Debug, + Clone, + PartialEq, + Eq, + Default, + Serialize, + Deserialize, + RlpEncodable, + RlpDecodable, +)] +#[rlp(trailing)] +pub struct StateDiffAccount { + /// The address of the account + pub address: Address, + /// Account balance. + pub balance: U256, + /// Account nonce. + pub nonce: u64, + /// code hash, + pub code_hash: B256, + /// code + pub code: Bytes, + /// If Account was destroyed we ignore original value and compare present state with U256::ZERO. + pub storage: Vec, + // Account status. + //pub status: AccountStatus, +} + +/// StateDiffStorage +#[derive( + Debug, + Clone, + PartialEq, + Eq, + Default, + Serialize, + Deserialize, + RlpEncodable, + RlpDecodable, +)] +pub struct StateDiffStorageSlot { + /// Storage slot key + pub key: U256, + /// Storage slot value + pub value: U256, +} + impl SealedBlock { /// Create a new sealed block instance using the sealed header and block body. #[inline] diff --git a/crates/primitives/src/lib.rs b/crates/primitives/src/lib.rs index 0c4f25057fc3..37ca30023b4c 100644 --- a/crates/primitives/src/lib.rs +++ b/crates/primitives/src/lib.rs @@ -40,7 +40,7 @@ pub mod transaction; pub use block::{generate_valid_header, valid_header_strategy}; pub use block::{ Block, BlockBody, BlockHashOrNumber, BlockId, BlockNumHash, BlockNumberOrTag, BlockWithSenders, - ForkBlock, RpcBlockHash, SealedBlock, SealedBlockWithSenders, + ForkBlock, RpcBlockHash, SealedBlock, SealedBlockWithSenders, StateDiff, StateDiffAccount, StateDiffStorageSlot, }; #[cfg(feature = "reth-codec")] pub use compression::*; diff --git a/crates/rpc/rpc-types-compat/src/engine/payload.rs b/crates/rpc/rpc-types-compat/src/engine/payload.rs index 933beb985561..5a17f3eebabf 100644 --- a/crates/rpc/rpc-types-compat/src/engine/payload.rs +++ b/crates/rpc/rpc-types-compat/src/engine/payload.rs @@ -14,9 +14,10 @@ use reth_rpc_types::engine::{ /// Converts [`ExecutionPayloadV1`] to [`Block`] pub fn try_payload_v1_to_block(payload: ExecutionPayloadV1) -> Result { - if payload.extra_data.len() > MAXIMUM_EXTRA_DATA_SIZE { - return Err(PayloadError::ExtraData(payload.extra_data)) - } + // TODO(Brecht) + // if payload.extra_data.len() > MAXIMUM_EXTRA_DATA_SIZE { + // return Err(PayloadError::ExtraData(payload.extra_data)) + // } if payload.base_fee_per_gas.is_zero() { return Err(PayloadError::BaseFee(payload.base_fee_per_gas)) diff --git a/packages/protocol/contracts/L1/TaikoData.sol b/packages/protocol/contracts/L1/TaikoData.sol index 91d983740b44..f43ea58eb03c 100644 --- a/packages/protocol/contracts/L1/TaikoData.sol +++ b/packages/protocol/contracts/L1/TaikoData.sol @@ -40,6 +40,23 @@ library TaikoData { // bytes32 blobId OR blobHash; ? as per in current taiko-mono's preconfirmation branch ? bool blobUsed; bytes txList; + bytes stateDiffs; + StateDiff l1StateDiff; + } + + /// @dev Struct representing the state delta that has to be applied to L1 + struct StateDiff { + StateDiffAccount[] accounts; + } + + struct StateDiffAccount { + address addr; + StateDiffStorageSlot[] slots; + } + + struct StateDiffStorageSlot { + bytes32 key; + bytes32 value; } /// @dev Struct representing transition to be proven. diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index cbc43be7d332..cd17ba3a2618 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -10,6 +10,7 @@ import "../common/EssentialContract.sol"; import "./TaikoErrors.sol"; import "./preconfs/ISequencerRegistry.sol"; import "./TaikoEvents.sol"; +import "../gwyneth/GwynethContract.sol"; /// @title TaikoL1 contract TaikoL1 is EssentialContract, TaikoEvents, TaikoErrors { @@ -150,6 +151,12 @@ contract TaikoL1 is EssentialContract, TaikoEvents, TaikoErrors { // revert L1_INVALID_TIMESTAMP(); // } + + // Apply L1 state updates + for (uint i = 0; i < _block.l1StateDiff.accounts.length; i++) { + GwynethContract(_block.l1StateDiff.accounts[i].addr).applyStateDelta(_block.l1StateDiff.accounts[i].slots); + } + emit BlockProposed({ blockId: _block.l2BlockNumber, meta: _block }); } diff --git a/packages/protocol/contracts/examples/xERC20.sol b/packages/protocol/contracts/examples/xERC20.sol index 954e26abdbe5..153d4f0d5ea0 100644 --- a/packages/protocol/contracts/examples/xERC20.sol +++ b/packages/protocol/contracts/examples/xERC20.sol @@ -2,8 +2,9 @@ pragma solidity ^0.8.19; import "./EVM.sol"; +import "../gwyneth/GwynethContract.sol"; -contract xERC20 { +contract xERC20 is GwynethContract { mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; diff --git a/packages/protocol/contracts/gwyneth/GwynethContract.sol b/packages/protocol/contracts/gwyneth/GwynethContract.sol new file mode 100644 index 000000000000..ce786e14cf09 --- /dev/null +++ b/packages/protocol/contracts/gwyneth/GwynethContract.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + + +import "../L1/TaikoData.sol"; + +contract GwynethContract { + function applyStateDelta(TaikoData.StateDiffStorageSlot[] calldata slots) + external + { + // TODO(Brecht): check msg.sender + // Run over all state changes + for (uint256 i = 0; i < slots.length; i++) { + // Apply the updated state to the storage + bytes32 key = slots[i].key; + bytes32 value = slots[i].value; + // Possible to check the slot against any variable.slot + // to e.g. throw a custom event + assembly { + sstore(key, value) + } + } + } +} \ No newline at end of file diff --git a/packages/protocol/scripts/DeployL1Locally.s.sol b/packages/protocol/scripts/DeployL1Locally.s.sol index 0ff10e09721a..8e90ff4a9f4c 100644 --- a/packages/protocol/scripts/DeployL1Locally.s.sol +++ b/packages/protocol/scripts/DeployL1Locally.s.sol @@ -62,6 +62,11 @@ contract DeployL1Locally is DeployCapability { // addressNotNull(vm.envAddress("L2_SIGNAL_SERVICE"), "L2_SIGNAL_SERVICE"); // addressNotNull(vm.envAddress("CONTRACT_OWNER"), "CONTRACT_OWNER"); + // Sending 10 ETH to Alice + address payable admin = payable(0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266); + (bool success, ) = admin.call{value: 10 ether}(""); + require(success, "Failed to send Ether"); + require(vm.envBytes32("L2_GENESIS_HASH") != 0, "L2_GENESIS_HASH"); address contractOwner = MAINNET_CONTRACT_OWNER; diff --git a/packages/protocol/scripts/deploy_and_xtransfer.sh b/packages/protocol/scripts/deploy_and_xtransfer.sh index ee8f65a2473d..60a1c2e6101f 100755 --- a/packages/protocol/scripts/deploy_and_xtransfer.sh +++ b/packages/protocol/scripts/deploy_and_xtransfer.sh @@ -14,17 +14,17 @@ check_contract_deployment() { local deployed=false echo -e "${YELLOW}Waiting for contract deployment confirmation...${NC}" - + for i in $(seq 1 $retries); do # Using curl to check if the contract code exists at the address result=$(curl -s -X POST -H "Content-Type: application/json" --data "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getCode\",\"params\":[\"$contract_addr\", \"latest\"],\"id\":1}" $rpc_url) - + # Check if the result contains more than just "0x" (empty contract) if [[ $result == *"0x60806040"* ]]; then deployed=true break fi - + echo -e "${YELLOW}Attempt $i/$retries: Contract not yet deployed, waiting...${NC}" sleep 2 done @@ -38,6 +38,36 @@ check_contract_deployment() { fi } + +echo -e "${GREEN}Deploying to L1...${NC}" +# Capture the forge script output +L1_OUTPUT=$(forge script --rpc-url http://127.0.0.1:32002 scripts/DeployXERC20.s.sol -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy) + +# Extract the contract address - improved pattern matching +CONTRACT_ADDRESS=$(echo "$L1_OUTPUT" | grep -o '0x[a-fA-F0-9]\{40\}' | head -n 1) + +if [ -z "$CONTRACT_ADDRESS" ]; then + echo -e "${RED}Failed to extract contract address from deployment output${NC}" + exit 1 +fi + +echo -e "${GREEN}Extracted contract address: $CONTRACT_ADDRESS${NC}" + +if [ $? -eq 0 ]; then + # Check if contract is deployed on L1 + if check_contract_deployment "http://127.0.0.1:32002" "$CONTRACT_ADDRESS"; then + echo -e "${GREEN}Verifying L2A contract...${NC}" + forge verify-contract "$CONTRACT_ADDRESS" "contracts/examples/xERC20.sol:xERC20" --watch --verifier-url "http://localhost:64001/api" --verifier blockscout --chain-id 160010 --libraries contracts/examples/EVM.sol:EVM:0x5FbDB2315678afecb367f032d93F642f64180aa3 + else + echo -e "${RED}L1 deployment verification failed. Stopping.${NC}" + exit 1 + fi +else + echo -e "${RED}L1 deployment failed. Stopping.${NC}" + exit 1 +fi + + echo -e "${GREEN}Deploying to L2A...${NC}" # Capture the forge script output L2A_OUTPUT=$(forge script --rpc-url http://127.0.0.1:32005 scripts/DeployXERC20.s.sol -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy) @@ -66,6 +96,7 @@ else exit 1 fi + echo -e "${GREEN}Deploying to L2B...${NC}" forge script --rpc-url http://127.0.0.1:32006 scripts/DeployXERC20.s.sol -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy From 4a1608a2362cfd48cb1414d676e834919cc29cc1 Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Thu, 2 Jan 2025 01:18:47 +0100 Subject: [PATCH 17/24] State diff + make syncing build the same block as rbuilder --- Cargo.lock | 1 + Cargo.toml | 1 + crates/gwyneth/Cargo.toml | 1 + crates/gwyneth/TaikoL1.json | 2 +- crates/gwyneth/src/builder.rs | 11 ++++++++-- crates/gwyneth/src/exex.rs | 22 +++++++++++++++---- crates/gwyneth/src/lib.rs | 8 ++++++- etc/assertoor/assertoor-template.yaml | 2 +- packages/protocol/contracts/L1/TaikoL1.sol | 6 ++--- .../check_xchain_balances.py | 2 +- .../scripts/confs/network_params.yaml | 5 ----- packages/protocol/scripts/xTransfer.s.sol | 17 +++++++++++++- 12 files changed, 59 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c995eb7c6fc0..0757cfb0a098 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3457,6 +3457,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", + "bincode", "eyre", "futures", "futures-util", diff --git a/Cargo.toml b/Cargo.toml index 8f258d1505f7..8755500ebce8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -494,6 +494,7 @@ tracing = "0.1.0" tracing-appender = "0.2" url = "2.3" zstd = "0.13" +bincode = "1.3" # metrics metrics = "0.23.0" diff --git a/crates/gwyneth/Cargo.toml b/crates/gwyneth/Cargo.toml index 6425801b9c76..f73d157ac88f 100644 --- a/crates/gwyneth/Cargo.toml +++ b/crates/gwyneth/Cargo.toml @@ -66,6 +66,7 @@ thiserror.workspace = true tracing.workspace = true jsonrpsee.workspace = true revm.workspace = true +bincode.workspace = true # alloy alloy-sol-types = { workspace = true, features = ["json"] } \ No newline at end of file diff --git a/crates/gwyneth/TaikoL1.json b/crates/gwyneth/TaikoL1.json index 905772a8199c..33e82d034d2c 100644 --- a/crates/gwyneth/TaikoL1.json +++ b/crates/gwyneth/TaikoL1.json @@ -1 +1 @@ -{"abi":[{"type":"function","name":"MAX_BYTES_PER_BLOB","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"SECURITY_DELAY_AFTER_PROVEN","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"acceptOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addressManager","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getConfig","inputs":[],"outputs":[{"name":"","type":"tuple","internalType":"struct TaikoData.Config","components":[{"name":"chainId","type":"uint64","internalType":"uint64"},{"name":"blockMaxGasLimit","type":"uint32","internalType":"uint32"},{"name":"blockMaxTxListBytes","type":"uint24","internalType":"uint24"}]}],"stateMutability":"view"},{"type":"function","name":"impl","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"inNonReentrant","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"init","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_addressManager","type":"address","internalType":"address"},{"name":"_genesisBlockHash","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isConfigValid","inputs":[{"name":"config","type":"tuple","internalType":"struct TaikoData.Config","components":[{"name":"chainId","type":"uint64","internalType":"uint64"},{"name":"blockMaxGasLimit","type":"uint32","internalType":"uint32"},{"name":"blockMaxTxListBytes","type":"uint24","internalType":"uint24"}]}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"lastUnpausedAt","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"pause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"pendingOwner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proposeBlock","inputs":[{"name":"data","type":"tuple[]","internalType":"struct TaikoData.BlockMetadata[]","components":[{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentBlockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentMetaHash","type":"bytes32","internalType":"bytes32"},{"name":"l1Hash","type":"bytes32","internalType":"bytes32"},{"name":"difficulty","type":"uint256","internalType":"uint256"},{"name":"blobHash","type":"bytes32","internalType":"bytes32"},{"name":"extraData","type":"bytes32","internalType":"bytes32"},{"name":"coinbase","type":"address","internalType":"address"},{"name":"l2BlockNumber","type":"uint64","internalType":"uint64"},{"name":"gasLimit","type":"uint32","internalType":"uint32"},{"name":"l1StateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"timestamp","type":"uint64","internalType":"uint64"},{"name":"txListByteOffset","type":"uint24","internalType":"uint24"},{"name":"txListByteSize","type":"uint24","internalType":"uint24"},{"name":"blobUsed","type":"bool","internalType":"bool"},{"name":"txList","type":"bytes","internalType":"bytes"}]}],"outputs":[{"name":"_blocks","type":"tuple[]","internalType":"struct TaikoData.BlockMetadata[]","components":[{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentBlockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentMetaHash","type":"bytes32","internalType":"bytes32"},{"name":"l1Hash","type":"bytes32","internalType":"bytes32"},{"name":"difficulty","type":"uint256","internalType":"uint256"},{"name":"blobHash","type":"bytes32","internalType":"bytes32"},{"name":"extraData","type":"bytes32","internalType":"bytes32"},{"name":"coinbase","type":"address","internalType":"address"},{"name":"l2BlockNumber","type":"uint64","internalType":"uint64"},{"name":"gasLimit","type":"uint32","internalType":"uint32"},{"name":"l1StateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"timestamp","type":"uint64","internalType":"uint64"},{"name":"txListByteOffset","type":"uint24","internalType":"uint24"},{"name":"txListByteSize","type":"uint24","internalType":"uint24"},{"name":"blobUsed","type":"bool","internalType":"bool"},{"name":"txList","type":"bytes","internalType":"bytes"}]}],"stateMutability":"payable"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resolve","inputs":[{"name":"_chainId","type":"uint64","internalType":"uint64"},{"name":"_name","type":"bytes32","internalType":"bytes32"},{"name":"_allowZeroAddress","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"view"},{"type":"function","name":"resolve","inputs":[{"name":"_name","type":"bytes32","internalType":"bytes32"},{"name":"_allowZeroAddress","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"view"},{"type":"function","name":"state","inputs":[],"outputs":[{"name":"genesisHeight","type":"uint64","internalType":"uint64"},{"name":"genesisTimestamp","type":"uint64","internalType":"uint64"},{"name":"numBlocks","type":"uint64","internalType":"uint64"},{"name":"lastVerifiedBlockId","type":"uint64","internalType":"uint64"},{"name":"provingPaused","type":"bool","internalType":"bool"},{"name":"lastUnpausedAt","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"unpause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BlockProposed","inputs":[{"name":"blockId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"meta","type":"tuple","indexed":false,"internalType":"struct TaikoData.BlockMetadata","components":[{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentBlockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentMetaHash","type":"bytes32","internalType":"bytes32"},{"name":"l1Hash","type":"bytes32","internalType":"bytes32"},{"name":"difficulty","type":"uint256","internalType":"uint256"},{"name":"blobHash","type":"bytes32","internalType":"bytes32"},{"name":"extraData","type":"bytes32","internalType":"bytes32"},{"name":"coinbase","type":"address","internalType":"address"},{"name":"l2BlockNumber","type":"uint64","internalType":"uint64"},{"name":"gasLimit","type":"uint32","internalType":"uint32"},{"name":"l1StateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"timestamp","type":"uint64","internalType":"uint64"},{"name":"txListByteOffset","type":"uint24","internalType":"uint24"},{"name":"txListByteSize","type":"uint24","internalType":"uint24"},{"name":"blobUsed","type":"bool","internalType":"bool"},{"name":"txList","type":"bytes","internalType":"bytes"}]}],"anonymous":false},{"type":"event","name":"BlockVerified","inputs":[{"name":"blockId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"blockHash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferStarted","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ProvingPaused","inputs":[{"name":"paused","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"TransitionProved","inputs":[{"name":"blockId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tran","type":"tuple","indexed":false,"internalType":"struct TaikoData.Transition","components":[{"name":"parentBlockHash","type":"bytes32","internalType":"bytes32"},{"name":"blockHash","type":"bytes32","internalType":"bytes32"}]},{"name":"prover","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"FUNC_NOT_IMPLEMENTED","inputs":[]},{"type":"error","name":"INVALID_PAUSE_STATUS","inputs":[]},{"type":"error","name":"L1_ALREADY_CONTESTED","inputs":[]},{"type":"error","name":"L1_ALREADY_PROVED","inputs":[]},{"type":"error","name":"L1_ASSIGNED_PROVER_NOT_ALLOWED","inputs":[]},{"type":"error","name":"L1_BLOB_FOR_DA_DISABLED","inputs":[]},{"type":"error","name":"L1_BLOB_NOT_FOUND","inputs":[]},{"type":"error","name":"L1_BLOB_NOT_REUSEABLE","inputs":[]},{"type":"error","name":"L1_BLOCK_MISMATCH","inputs":[]},{"type":"error","name":"L1_INCORRECT_BLOCK","inputs":[]},{"type":"error","name":"L1_INSUFFICIENT_TOKEN","inputs":[]},{"type":"error","name":"L1_INVALID_ADDRESS","inputs":[]},{"type":"error","name":"L1_INVALID_AMOUNT","inputs":[]},{"type":"error","name":"L1_INVALID_BLOCK_ID","inputs":[]},{"type":"error","name":"L1_INVALID_CONFIG","inputs":[]},{"type":"error","name":"L1_INVALID_ETH_DEPOSIT","inputs":[]},{"type":"error","name":"L1_INVALID_L1_STATE_BLOCK","inputs":[]},{"type":"error","name":"L1_INVALID_OR_DUPLICATE_VERIFIER","inputs":[]},{"type":"error","name":"L1_INVALID_PARAM","inputs":[]},{"type":"error","name":"L1_INVALID_PAUSE_STATUS","inputs":[]},{"type":"error","name":"L1_INVALID_PROOF","inputs":[]},{"type":"error","name":"L1_INVALID_PROPOSER","inputs":[]},{"type":"error","name":"L1_INVALID_PROVER","inputs":[]},{"type":"error","name":"L1_INVALID_TIER","inputs":[]},{"type":"error","name":"L1_INVALID_TIMESTAMP","inputs":[]},{"type":"error","name":"L1_INVALID_TRANSITION","inputs":[]},{"type":"error","name":"L1_LIVENESS_BOND_NOT_RECEIVED","inputs":[]},{"type":"error","name":"L1_NOT_ASSIGNED_PROVER","inputs":[]},{"type":"error","name":"L1_PROPOSER_NOT_EOA","inputs":[]},{"type":"error","name":"L1_PROVING_PAUSED","inputs":[]},{"type":"error","name":"L1_RECEIVE_DISABLED","inputs":[]},{"type":"error","name":"L1_TOO_MANY_BLOCKS","inputs":[]},{"type":"error","name":"L1_TOO_MANY_TIERS","inputs":[]},{"type":"error","name":"L1_TRANSITION_ID_ZERO","inputs":[]},{"type":"error","name":"L1_TRANSITION_NOT_FOUND","inputs":[]},{"type":"error","name":"L1_TXLIST_OFFSET_SIZE","inputs":[]},{"type":"error","name":"L1_TXLIST_TOO_LARGE","inputs":[]},{"type":"error","name":"L1_UNAUTHORIZED","inputs":[]},{"type":"error","name":"L1_UNEXPECTED_PARENT","inputs":[]},{"type":"error","name":"L1_UNEXPECTED_TRANSITION_ID","inputs":[]},{"type":"error","name":"L1_UNEXPECTED_TRANSITION_TIER","inputs":[]},{"type":"error","name":"REENTRANT_CALL","inputs":[]},{"type":"error","name":"RESOLVER_DENIED","inputs":[]},{"type":"error","name":"RESOLVER_INVALID_MANAGER","inputs":[]},{"type":"error","name":"RESOLVER_UNEXPECTED_CHAINID","inputs":[]},{"type":"error","name":"RESOLVER_ZERO_ADDR","inputs":[{"name":"chainId","type":"uint64","internalType":"uint64"},{"name":"name","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ZERO_ADDRESS","inputs":[]},{"type":"error","name":"ZERO_VALUE","inputs":[]}],"bytecode":{"object":"0x60a06040523060805234801562000014575f80fd5b506200001f6200002f565b620000296200002f565b620000ed565b5f54610100900460ff16156200009b5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000eb575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051611f12620001225f395f8181610792015281816107d201528181610881015281816108c1015261093c0152611f125ff3fe608060405260043610610147575f3560e01c806379ba5097116100b3578063c19d93fb1161006d578063c19d93fb14610349578063c3f909d4146103db578063e07baba614610425578063e2faea2b14610462578063e30c397814610482578063f2fde38b1461049f575f80fd5b806379ba5097146102bb57806381e3925f146102cf5780638456cb59146102e55780638abf6077146102f95780638da5cb5b1461030d578063a86f9d9e1461032a575f80fd5b80633f4ba83a116101045780633f4ba83a146102295780634f1ef2861461023d57806352d1902d146102505780635c975abb146102725780636b5ad7e014610292578063715018a6146102a7575f80fd5b806310f3ab1b1461014b5780633075db561461017f578063347258aa146101935780633659cfe6146101b45780633ab76e9f146101d35780633eb6b8cf1461020a575b5f80fd5b348015610156575f80fd5b5061016a610165366004611588565b6104be565b60405190151581526020015b60405180910390f35b34801561018a575f80fd5b5061016a61051f565b34801561019e575f80fd5b506101b26101ad366004611610565b610533565b005b3480156101bf575f80fd5b506101b26101ce36600461164e565b610788565b3480156101de575f80fd5b506097546101f2906001600160a01b031681565b6040516001600160a01b039091168152602001610176565b348015610215575f80fd5b506101f261022436600461167f565b61084f565b348015610234575f80fd5b506101b2610863565b6101b261024b366004611723565b610877565b34801561025b575f80fd5b50610264610930565b604051908152602001610176565b34801561027d575f80fd5b5061016a60c954610100900460ff1660021490565b34801561029d575f80fd5b5061026461708081565b3480156102b2575f80fd5b506101b26109e1565b3480156102c6575f80fd5b506101b26109f2565b3480156102da575f80fd5b506102646202000081565b3480156102f0575f80fd5b506101b2610a69565b348015610304575f80fd5b506101f2610a7c565b348015610318575f80fd5b506033546001600160a01b03166101f2565b348015610335575f80fd5b506101f261034436600461176f565b610a8a565b348015610354575f80fd5b5060fd5460fe54610399916001600160401b0380821692600160401b8304821692600160801b8104831692600160c01b90910481169160ff8116916101009091041686565b604080516001600160401b03978816815295871660208701529386169385019390935290841660608401521515608083015290911660a082015260c001610176565b3480156103e6575f80fd5b506103ef610a9f565b6040805182516001600160401b0316815260208084015163ffffffff16908201529181015162ffffff1690820152606001610176565b348015610430575f80fd5b5060c95461044a906201000090046001600160401b031681565b6040516001600160401b039091168152602001610176565b610475610470366004611799565b610ae3565b6040516101769190611854565b34801561048d575f80fd5b506065546001600160a01b03166101f2565b3480156104aa575f80fd5b506101b26104b936600461164e565b610ba1565b5f6001825f01516001600160401b03161115806104e35750602082015163ffffffff16155b806104f55750604082015162ffffff16155b8061050b575062020000826040015162ffffff16115b1561051757505f919050565b506001919050565b5f600261052a610c12565b60ff1614905090565b5f54610100900460ff161580801561055157505f54600160ff909116105b8061056a5750303b15801561056a57505f5460ff166001145b6105d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156105f3575f805461ff0019166101001790555b6105fd8484610c51565b5f610606610a9f565b9050610611816104be565b61064e5760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420636f6e66696760901b60448201526064016105c9565b60fd805467ffffffffffffffff60801b19426001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff19909316439190911617821716600160801b179091555f80805260fb6020527fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d89758581557fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d897780546fffffffffffffffff000000000000000019169093179092556040517f68b82650828a9621868d09dc161400acbe189fa002e3fb7cf9dea5c2c6f928ee906107339087815260200190565b60405180910390a250508015610782575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036107d05760405162461bcd60e51b81526004016105c990611997565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610802610c90565b6001600160a01b0316146108285760405162461bcd60e51b81526004016105c9906119e3565b61083181610cab565b604080515f8082526020820190925261084c91839190610cb3565b50565b5f61085b848484610e1d565b949350505050565b61086b610f0e565b610875335f610f9e565b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108bf5760405162461bcd60e51b81526004016105c990611997565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108f1610c90565b6001600160a01b0316146109175760405162461bcd60e51b81526004016105c9906119e3565b61092082610cab565b61092c82826001610cb3565b5050565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109cf5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016105c9565b505f80516020611e9683398151915290565b6109e9610fa2565b6108755f610ffc565b60655433906001600160a01b03168114610a605760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016105c9565b61084c81610ffc565b610a71611015565b610875336001610f9e565b5f610a85610c90565b905090565b5f610a96468484610e1d565b90505b92915050565b604080516060810182525f8082526020820181905291810191909152506040805160608101825262028c60815262e4e1c060208201526201d4c09181019190915290565b60606002610aef610c12565b60ff1603610b105760405163dfc60d8560e01b815260040160405180910390fd5b610b1a6002611086565b610b2e60c954610100900460ff1660021490565b15610b4c5760405163bae6e2a960e01b815260040160405180910390fd5b5f5b82811015610b8a57610b82848483818110610b6b57610b6b611a2f565b9050602002810190610b7d9190611a43565b6110ce565b600101610b4e565b50610b958284611a62565b9050610a996001611086565b610ba9610fa2565b606580546001600160a01b0383166001600160a01b03199091168117909155610bda6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f610c1c46611123565b15610c4757507fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5c90565b5060c95460ff1690565b806001600160a01b038116610c795760405163538ba4f960e01b815260040160405180910390fd5b610c8283611150565b610c8b826111ae565b505050565b5f80516020611e96833981519152546001600160a01b031690565b61084c610fa2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610ce657610c8b8361121e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610d40575060408051601f3d908101601f19168201909252610d3d91810190611be4565b60015b610da35760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016105c9565b5f80516020611e968339815191528114610e115760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016105c9565b50610c8b8383836112b9565b6097545f906001600160a01b031680610e4957604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0386166004820152602481018590526001600160a01b038216906328f713cc90604401602060405180830381865afa158015610e9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf9190611bfb565b915082158015610ed657506001600160a01b038216155b15610f0657604051632b0d65db60e01b81526001600160401b0386166004820152602481018590526044016105c9565b509392505050565b610f2260c954610100900460ff1660021490565b610f3f5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b61092c5b6033546001600160a01b031633146108755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c9565b606580546001600160a01b031916905561084c816112dd565b61102960c954610100900460ff1660021490565b156110475760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610f94565b61108f46611123565b156110ba57807fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5d50565b60c9805460ff831660ff1990911617905550565b6110e061012082016101008301611c16565b6001600160401b03167f7e1269cdb1d669874acd6278ef79b41aabcc28ca4db9a0ef9f5a2f79a03d21f2826040516111189190611c9f565b60405180910390a250565b5f6001821480611134575061426882145b80611141575062aa36a782145b80610a995750610a998261132e565b5f54610100900460ff166111765760405162461bcd60e51b81526004016105c990611e27565b61117e611345565b61119c6001600160a01b038216156111965781610ffc565b33610ffc565b5060c9805461ff001916610100179055565b5f54610100900460ff166111d45760405162461bcd60e51b81526004016105c990611e27565b6001600160401b034611156111fc5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381163b61128b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016105c9565b5f80516020611e9683398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6112c28361136b565b5f825111806112ce5750805b15610c8b5761078283836113aa565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f617e2c8210158015610a99575050617e90101590565b5f54610100900460ff166108755760405162461bcd60e51b81526004016105c990611e27565b6113748161121e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610a968383604051806060016040528060278152602001611eb66027913960605f80856001600160a01b0316856040516113e69190611e72565b5f60405180830381855af49150503d805f811461141e576040519150601f19603f3d011682016040523d82523d5f602084013e611423565b606091505b50915091506114348683838761143e565b9695505050505050565b606083156114ac5782515f036114a5576001600160a01b0385163b6114a55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105c9565b508161085b565b61085b83838151156114c15781518083602001fd5b8060405162461bcd60e51b81526004016105c99190611e83565b634e487b7160e01b5f52604160045260245ffd5b60405161020081016001600160401b0381118282101715611512576115126114db565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611540576115406114db565b604052919050565b80356001600160401b038116811461155e575f80fd5b919050565b803563ffffffff8116811461155e575f80fd5b803562ffffff8116811461155e575f80fd5b5f60608284031215611598575f80fd5b604051606081018181106001600160401b03821117156115ba576115ba6114db565b6040526115c683611548565b81526115d460208401611563565b60208201526115e560408401611576565b60408201529392505050565b6001600160a01b038116811461084c575f80fd5b803561155e816115f1565b5f805f60608486031215611622575f80fd5b833561162d816115f1565b9250602084013561163d816115f1565b929592945050506040919091013590565b5f6020828403121561165e575f80fd5b8135611669816115f1565b9392505050565b8035801515811461155e575f80fd5b5f805f60608486031215611691575f80fd5b61169a84611548565b9250602084013591506116af60408501611670565b90509250925092565b5f82601f8301126116c7575f80fd5b81356001600160401b038111156116e0576116e06114db565b6116f3601f8201601f1916602001611518565b818152846020838601011115611707575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215611734575f80fd5b823561173f816115f1565b915060208301356001600160401b03811115611759575f80fd5b611765858286016116b8565b9150509250929050565b5f8060408385031215611780575f80fd5b8235915061179060208401611670565b90509250929050565b5f80602083850312156117aa575f80fd5b82356001600160401b03808211156117c0575f80fd5b818501915085601f8301126117d3575f80fd5b8135818111156117e1575f80fd5b8660208260051b85010111156117f5575f80fd5b60209290920196919550909350505050565b5f5b83811015611821578181015183820152602001611809565b50505f910152565b5f8151808452611840816020860160208601611807565b601f01601f19169290920160200192915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561198957888303603f1901855281518051845287810151888501528681015187850152606080820151908501526080808201519085015260a0808201519085015260c0808201519085015260e0808201516001600160a01b031690850152610100808201516001600160401b03908116918601919091526101208083015163ffffffff90811691870191909152610140808401519091169086015261016080830151909116908501526101808082015162ffffff908116918601919091526101a080830151909116908501526101c0808201511515908501526101e0908101516102009185018290529061197581860183611829565b96890196945050509086019060010161187b565b509098975050505050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f82356101fe19833603018112611a58575f80fd5b9190910192915050565b5f6001600160401b0380841115611a7b57611a7b6114db565b8360051b6020611a8c818301611518565b868152918501918181019036841115611aa3575f80fd5b865b84811015611bd857803586811115611abb575f80fd5b8801610200368290031215611ace575f80fd5b611ad66114ef565b81358152858201358682015260408083013590820152606080830135908201526080808301359082015260a0808301359082015260c0808301359082015260e0611b21818401611605565b90820152610100611b33838201611548565b90820152610120611b45838201611563565b90820152610140611b57838201611563565b90820152610160611b69838201611548565b90820152610180611b7b838201611576565b908201526101a0611b8d838201611576565b908201526101c0611b9f838201611670565b908201526101e08281013589811115611bb6575f80fd5b611bc2368286016116b8565b9183019190915250845250918301918301611aa5565b50979650505050505050565b5f60208284031215611bf4575f80fd5b5051919050565b5f60208284031215611c0b575f80fd5b8151611669816115f1565b5f60208284031215611c26575f80fd5b610a9682611548565b5f808335601e19843603018112611c44575f80fd5b83016020810192503590506001600160401b03811115611c62575f80fd5b803603821315611c70575f80fd5b9250929050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6020815281356020820152602082013560408201526040820135606082015260608201356080820152608082013560a082015260a082013560c082015260c082013560e08201525f611cf360e08401611605565b610100611d0a818501836001600160a01b03169052565b611d15818601611548565b915050610120611d2f818501836001600160401b03169052565b611d3a818601611563565b915050610140611d518185018363ffffffff169052565b611d5c818601611563565b915050610160611d738185018363ffffffff169052565b611d7e818601611548565b915050610180611d98818501836001600160401b03169052565b611da3818601611576565b9150506101a0611db98185018362ffffff169052565b611dc4818601611576565b9150506101c0611dda8185018362ffffff169052565b611de5818601611670565b9150506101e0611df88185018315159052565b611e0481860186611c2f565b6102008681015292509050611e1e61022085018383611c77565b95945050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f8251611a58818460208701611807565b602081525f610a96602083018461182956fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d413d52573e5063a20f64e31ccd5b89a452f140b7a06fa70bba6eda2988c5fec64736f6c63430008180033","sourceMap":"394:7585:5:-:0;;;1088:4:100;1045:48;;394:7585:5;;;;;;;;;-1:-1:-1;1488:22:26;:20;:22::i;:::-;2712::27;:20;:22::i;:::-;394:7585:5;;5939:280:65;6007:13;;;;;;;6006:14;5998:66;;;;-1:-1:-1;;;5998:66:65;;216:2:161;5998:66:65;;;198:21:161;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:161;;;338:37;392:19;;5998:66:65;;;;;;;;6078:12;;6094:15;6078:12;;;:31;6074:139;;6125:12;:30;;-1:-1:-1;;6125:30:65;6140:15;6125:30;;;;;;6174:28;;564:36:161;;;6174:28:65;;552:2:161;537:18;6174:28:65;;;;;;;6074:139;5939:280::o;422:184:161:-;394:7585:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405260043610610147575f3560e01c806379ba5097116100b3578063c19d93fb1161006d578063c19d93fb14610349578063c3f909d4146103db578063e07baba614610425578063e2faea2b14610462578063e30c397814610482578063f2fde38b1461049f575f80fd5b806379ba5097146102bb57806381e3925f146102cf5780638456cb59146102e55780638abf6077146102f95780638da5cb5b1461030d578063a86f9d9e1461032a575f80fd5b80633f4ba83a116101045780633f4ba83a146102295780634f1ef2861461023d57806352d1902d146102505780635c975abb146102725780636b5ad7e014610292578063715018a6146102a7575f80fd5b806310f3ab1b1461014b5780633075db561461017f578063347258aa146101935780633659cfe6146101b45780633ab76e9f146101d35780633eb6b8cf1461020a575b5f80fd5b348015610156575f80fd5b5061016a610165366004611588565b6104be565b60405190151581526020015b60405180910390f35b34801561018a575f80fd5b5061016a61051f565b34801561019e575f80fd5b506101b26101ad366004611610565b610533565b005b3480156101bf575f80fd5b506101b26101ce36600461164e565b610788565b3480156101de575f80fd5b506097546101f2906001600160a01b031681565b6040516001600160a01b039091168152602001610176565b348015610215575f80fd5b506101f261022436600461167f565b61084f565b348015610234575f80fd5b506101b2610863565b6101b261024b366004611723565b610877565b34801561025b575f80fd5b50610264610930565b604051908152602001610176565b34801561027d575f80fd5b5061016a60c954610100900460ff1660021490565b34801561029d575f80fd5b5061026461708081565b3480156102b2575f80fd5b506101b26109e1565b3480156102c6575f80fd5b506101b26109f2565b3480156102da575f80fd5b506102646202000081565b3480156102f0575f80fd5b506101b2610a69565b348015610304575f80fd5b506101f2610a7c565b348015610318575f80fd5b506033546001600160a01b03166101f2565b348015610335575f80fd5b506101f261034436600461176f565b610a8a565b348015610354575f80fd5b5060fd5460fe54610399916001600160401b0380821692600160401b8304821692600160801b8104831692600160c01b90910481169160ff8116916101009091041686565b604080516001600160401b03978816815295871660208701529386169385019390935290841660608401521515608083015290911660a082015260c001610176565b3480156103e6575f80fd5b506103ef610a9f565b6040805182516001600160401b0316815260208084015163ffffffff16908201529181015162ffffff1690820152606001610176565b348015610430575f80fd5b5060c95461044a906201000090046001600160401b031681565b6040516001600160401b039091168152602001610176565b610475610470366004611799565b610ae3565b6040516101769190611854565b34801561048d575f80fd5b506065546001600160a01b03166101f2565b3480156104aa575f80fd5b506101b26104b936600461164e565b610ba1565b5f6001825f01516001600160401b03161115806104e35750602082015163ffffffff16155b806104f55750604082015162ffffff16155b8061050b575062020000826040015162ffffff16115b1561051757505f919050565b506001919050565b5f600261052a610c12565b60ff1614905090565b5f54610100900460ff161580801561055157505f54600160ff909116105b8061056a5750303b15801561056a57505f5460ff166001145b6105d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156105f3575f805461ff0019166101001790555b6105fd8484610c51565b5f610606610a9f565b9050610611816104be565b61064e5760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420636f6e66696760901b60448201526064016105c9565b60fd805467ffffffffffffffff60801b19426001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff19909316439190911617821716600160801b179091555f80805260fb6020527fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d89758581557fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d897780546fffffffffffffffff000000000000000019169093179092556040517f68b82650828a9621868d09dc161400acbe189fa002e3fb7cf9dea5c2c6f928ee906107339087815260200190565b60405180910390a250508015610782575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036107d05760405162461bcd60e51b81526004016105c990611997565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610802610c90565b6001600160a01b0316146108285760405162461bcd60e51b81526004016105c9906119e3565b61083181610cab565b604080515f8082526020820190925261084c91839190610cb3565b50565b5f61085b848484610e1d565b949350505050565b61086b610f0e565b610875335f610f9e565b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108bf5760405162461bcd60e51b81526004016105c990611997565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108f1610c90565b6001600160a01b0316146109175760405162461bcd60e51b81526004016105c9906119e3565b61092082610cab565b61092c82826001610cb3565b5050565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109cf5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016105c9565b505f80516020611e9683398151915290565b6109e9610fa2565b6108755f610ffc565b60655433906001600160a01b03168114610a605760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016105c9565b61084c81610ffc565b610a71611015565b610875336001610f9e565b5f610a85610c90565b905090565b5f610a96468484610e1d565b90505b92915050565b604080516060810182525f8082526020820181905291810191909152506040805160608101825262028c60815262e4e1c060208201526201d4c09181019190915290565b60606002610aef610c12565b60ff1603610b105760405163dfc60d8560e01b815260040160405180910390fd5b610b1a6002611086565b610b2e60c954610100900460ff1660021490565b15610b4c5760405163bae6e2a960e01b815260040160405180910390fd5b5f5b82811015610b8a57610b82848483818110610b6b57610b6b611a2f565b9050602002810190610b7d9190611a43565b6110ce565b600101610b4e565b50610b958284611a62565b9050610a996001611086565b610ba9610fa2565b606580546001600160a01b0383166001600160a01b03199091168117909155610bda6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f610c1c46611123565b15610c4757507fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5c90565b5060c95460ff1690565b806001600160a01b038116610c795760405163538ba4f960e01b815260040160405180910390fd5b610c8283611150565b610c8b826111ae565b505050565b5f80516020611e96833981519152546001600160a01b031690565b61084c610fa2565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610ce657610c8b8361121e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610d40575060408051601f3d908101601f19168201909252610d3d91810190611be4565b60015b610da35760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016105c9565b5f80516020611e968339815191528114610e115760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016105c9565b50610c8b8383836112b9565b6097545f906001600160a01b031680610e4957604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0386166004820152602481018590526001600160a01b038216906328f713cc90604401602060405180830381865afa158015610e9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebf9190611bfb565b915082158015610ed657506001600160a01b038216155b15610f0657604051632b0d65db60e01b81526001600160401b0386166004820152602481018590526044016105c9565b509392505050565b610f2260c954610100900460ff1660021490565b610f3f5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b61092c5b6033546001600160a01b031633146108755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c9565b606580546001600160a01b031916905561084c816112dd565b61102960c954610100900460ff1660021490565b156110475760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610f94565b61108f46611123565b156110ba57807fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5d50565b60c9805460ff831660ff1990911617905550565b6110e061012082016101008301611c16565b6001600160401b03167f7e1269cdb1d669874acd6278ef79b41aabcc28ca4db9a0ef9f5a2f79a03d21f2826040516111189190611c9f565b60405180910390a250565b5f6001821480611134575061426882145b80611141575062aa36a782145b80610a995750610a998261132e565b5f54610100900460ff166111765760405162461bcd60e51b81526004016105c990611e27565b61117e611345565b61119c6001600160a01b038216156111965781610ffc565b33610ffc565b5060c9805461ff001916610100179055565b5f54610100900460ff166111d45760405162461bcd60e51b81526004016105c990611e27565b6001600160401b034611156111fc5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381163b61128b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016105c9565b5f80516020611e9683398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6112c28361136b565b5f825111806112ce5750805b15610c8b5761078283836113aa565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f617e2c8210158015610a99575050617e90101590565b5f54610100900460ff166108755760405162461bcd60e51b81526004016105c990611e27565b6113748161121e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610a968383604051806060016040528060278152602001611eb66027913960605f80856001600160a01b0316856040516113e69190611e72565b5f60405180830381855af49150503d805f811461141e576040519150601f19603f3d011682016040523d82523d5f602084013e611423565b606091505b50915091506114348683838761143e565b9695505050505050565b606083156114ac5782515f036114a5576001600160a01b0385163b6114a55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105c9565b508161085b565b61085b83838151156114c15781518083602001fd5b8060405162461bcd60e51b81526004016105c99190611e83565b634e487b7160e01b5f52604160045260245ffd5b60405161020081016001600160401b0381118282101715611512576115126114db565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611540576115406114db565b604052919050565b80356001600160401b038116811461155e575f80fd5b919050565b803563ffffffff8116811461155e575f80fd5b803562ffffff8116811461155e575f80fd5b5f60608284031215611598575f80fd5b604051606081018181106001600160401b03821117156115ba576115ba6114db565b6040526115c683611548565b81526115d460208401611563565b60208201526115e560408401611576565b60408201529392505050565b6001600160a01b038116811461084c575f80fd5b803561155e816115f1565b5f805f60608486031215611622575f80fd5b833561162d816115f1565b9250602084013561163d816115f1565b929592945050506040919091013590565b5f6020828403121561165e575f80fd5b8135611669816115f1565b9392505050565b8035801515811461155e575f80fd5b5f805f60608486031215611691575f80fd5b61169a84611548565b9250602084013591506116af60408501611670565b90509250925092565b5f82601f8301126116c7575f80fd5b81356001600160401b038111156116e0576116e06114db565b6116f3601f8201601f1916602001611518565b818152846020838601011115611707575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215611734575f80fd5b823561173f816115f1565b915060208301356001600160401b03811115611759575f80fd5b611765858286016116b8565b9150509250929050565b5f8060408385031215611780575f80fd5b8235915061179060208401611670565b90509250929050565b5f80602083850312156117aa575f80fd5b82356001600160401b03808211156117c0575f80fd5b818501915085601f8301126117d3575f80fd5b8135818111156117e1575f80fd5b8660208260051b85010111156117f5575f80fd5b60209290920196919550909350505050565b5f5b83811015611821578181015183820152602001611809565b50505f910152565b5f8151808452611840816020860160208601611807565b601f01601f19169290920160200192915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561198957888303603f1901855281518051845287810151888501528681015187850152606080820151908501526080808201519085015260a0808201519085015260c0808201519085015260e0808201516001600160a01b031690850152610100808201516001600160401b03908116918601919091526101208083015163ffffffff90811691870191909152610140808401519091169086015261016080830151909116908501526101808082015162ffffff908116918601919091526101a080830151909116908501526101c0808201511515908501526101e0908101516102009185018290529061197581860183611829565b96890196945050509086019060010161187b565b509098975050505050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f82356101fe19833603018112611a58575f80fd5b9190910192915050565b5f6001600160401b0380841115611a7b57611a7b6114db565b8360051b6020611a8c818301611518565b868152918501918181019036841115611aa3575f80fd5b865b84811015611bd857803586811115611abb575f80fd5b8801610200368290031215611ace575f80fd5b611ad66114ef565b81358152858201358682015260408083013590820152606080830135908201526080808301359082015260a0808301359082015260c0808301359082015260e0611b21818401611605565b90820152610100611b33838201611548565b90820152610120611b45838201611563565b90820152610140611b57838201611563565b90820152610160611b69838201611548565b90820152610180611b7b838201611576565b908201526101a0611b8d838201611576565b908201526101c0611b9f838201611670565b908201526101e08281013589811115611bb6575f80fd5b611bc2368286016116b8565b9183019190915250845250918301918301611aa5565b50979650505050505050565b5f60208284031215611bf4575f80fd5b5051919050565b5f60208284031215611c0b575f80fd5b8151611669816115f1565b5f60208284031215611c26575f80fd5b610a9682611548565b5f808335601e19843603018112611c44575f80fd5b83016020810192503590506001600160401b03811115611c62575f80fd5b803603821315611c70575f80fd5b9250929050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6020815281356020820152602082013560408201526040820135606082015260608201356080820152608082013560a082015260a082013560c082015260c082013560e08201525f611cf360e08401611605565b610100611d0a818501836001600160a01b03169052565b611d15818601611548565b915050610120611d2f818501836001600160401b03169052565b611d3a818601611563565b915050610140611d518185018363ffffffff169052565b611d5c818601611563565b915050610160611d738185018363ffffffff169052565b611d7e818601611548565b915050610180611d98818501836001600160401b03169052565b611da3818601611576565b9150506101a0611db98185018362ffffff169052565b611dc4818601611576565b9150506101c0611dda8185018362ffffff169052565b611de5818601611670565b9150506101e0611df88185018315159052565b611e0481860186611c2f565b6102008681015292509050611e1e61022085018383611c77565b95945050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f8251611a58818460208701611807565b602081525f610a96602083018461182956fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d413d52573e5063a20f64e31ccd5b89a452f140b7a06fa70bba6eda2988c5fec64736f6c63430008180033","sourceMap":"394:7585:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7090:348;;;;;;;;;;-1:-1:-1;7090:348:5;;;;;:::i;:::-;;:::i;:::-;;;2045:14:161;;2038:22;2020:41;;2008:2;1993:18;7090:348:5;;;;;;;;3558:104:27;;;;;;;;;;;;;:::i;984:743:5:-;;;;;;;;;;-1:-1:-1;984:743:5;;;;;:::i;:::-;;:::i;:::-;;3143:195:100;;;;;;;;;;-1:-1:-1;3143:195:100;;;;;:::i;:::-;;:::i;453:29:26:-;;;;;;;;;;-1:-1:-1;453:29:26;;;;-1:-1:-1;;;;;453:29:26;;;;;;-1:-1:-1;;;;;3333:32:161;;;3315:51;;3303:2;3288:18;453:29:26;3169:203:161;1844:253:26;;;;;;;;;;-1:-1:-1;1844:253:26;;;;;:::i;:::-;;:::i;3031:207:27:-;;;;;;;;;;;;;:::i;3657:220:100:-;;;;;;:::i;:::-;;:::i;2762:131::-;;;;;;;;;;;;;:::i;:::-;;;5232:25:161;;;5220:2;5205:18;2762:131:100;5086:177:161;3466:86:27;;;;;;;;;;;;3528:8;;;;;:17;:8;521:1;3528:17;;3466:86;503:61:5;;;;;;;;;;;;557:7;503:61;;2085:101:60;;;;;;;;;;;;;:::i;2031:212:59:-;;;;;;;;;;;;;:::i;685:54:5:-;;;;;;;;;;;;730:9;685:54;;2784:202:27;;;;;;;;;;;;;:::i;3244:90::-;;;;;;;;;;;;;:::i;1462:85:60:-;;;;;;;;;;-1:-1:-1;1534:6:60;;-1:-1:-1;;;;;1534:6:60;1462:85;;1560:241:26;;;;;;;;;;-1:-1:-1;1560:241:26;;;;;:::i;:::-;;:::i;746:28:5:-;;;;;;;;;;-1:-1:-1;746:28:5;;;;;;-1:-1:-1;;;;;746:28:5;;;;-1:-1:-1;;;746:28:5;;;;;-1:-1:-1;;;746:28:5;;;;;-1:-1:-1;;;746:28:5;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6136:15:161;;;6118:34;;6188:15;;;6183:2;6168:18;;6161:43;6240:15;;;6220:18;;;6213:43;;;;6292:15;;;6287:2;6272:18;;6265:43;6352:14;6345:22;6339:3;6324:19;;6317:51;6405:15;;;6399:3;6384:19;;6377:44;6068:3;6053:19;746:28:5;5810:617:161;6571:513:5;;;;;;;;;;;;;:::i;:::-;;;;6842:13:161;;-1:-1:-1;;;;;6838:38:161;6820:57;;6937:4;6925:17;;;6919:24;6945:10;6915:41;6893:20;;;6886:71;7005:17;;;6999:24;7025:8;6995:39;6973:20;;;6966:69;6808:2;6793:18;6571:513:5;6628:413:161;1105:28:27;;;;;;;;;;-1:-1:-1;1105:28:27;;;;;;;-1:-1:-1;;;;;1105:28:27;;;;;;-1:-1:-1;;;;;7208:31:161;;;7190:50;;7178:2;7163:18;1105:28:27;7046:200:161;1781:510:5;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1144:99:59:-;;;;;;;;;;-1:-1:-1;1223:13:59;;-1:-1:-1;;;;;1223:13:59;1144:99;;1436:178;;;;;;;;;;-1:-1:-1;1436:178:59;;;;;:::i;:::-;;:::i;7090:348:5:-;7166:4;7217:1;7199:6;:14;;;-1:-1:-1;;;;;7199:19:5;;;:70;;;-1:-1:-1;7241:23:5;;;;:28;;;7199:70;:105;;;-1:-1:-1;7273:26:5;;;;:31;;;7199:105;:164;;;;7353:10;7324:6;:26;;;:39;;;7199:164;7182:227;;;-1:-1:-1;7404:5:5;;7090:348;-1:-1:-1;7090:348:5:o;7182:227::-;-1:-1:-1;7427:4:5;;7090:348;-1:-1:-1;7090:348:5:o;3558:104:27:-;3605:4;521:1;3628:18;:16;:18::i;:::-;:27;;;3621:34;;3558:104;:::o;984:743:5:-;3279:19:65;3302:13;;;;;;3301:14;;3347:34;;;;-1:-1:-1;3365:12:65;;3380:1;3365:12;;;;:16;3347:34;3346:108;;;-1:-1:-1;3426:4:65;1713:19:81;:23;;;3387:66:65;;-1:-1:-1;3436:12:65;;;;;:17;3387:66;3325:201;;;;-1:-1:-1;;;3325:201:65;;11359:2:161;3325:201:65;;;11341:21:161;11398:2;11378:18;;;11371:30;11437:34;11417:18;;;11410:62;-1:-1:-1;;;11488:18:161;;;11481:44;11542:19;;3325:201:65;;;;;;;;;3536:12;:16;;-1:-1:-1;;3536:16:65;3551:1;3536:16;;;3562:65;;;;3596:13;:20;;-1:-1:-1;;3596:20:65;;;;;3562:65;1147:41:5::1;1164:6;1172:15;1147:16;:41::i;:::-;1199:30;1232:11;:9;:11::i;:::-;1199:44;;1261:21;1275:6;1261:13;:21::i;:::-;1253:48;;;::::0;-1:-1:-1;;;1253:48:5;;11774:2:161;1253:48:5::1;::::0;::::1;11756:21:161::0;11813:2;11793:18;;;11786:30;-1:-1:-1;;;11832:18:161;;;11825:44;11886:18;;1253:48:5::1;11572:338:161::0;1253:48:5::1;1334:19:::0;:42;;-1:-1:-1;;;;1418:15:5::1;-1:-1:-1::0;;;;;1386:48:5;;::::1;-1:-1:-1::0;;;1386:48:5::1;-1:-1:-1::0;;1386:48:5;;;1363:12:::1;1334:42:::0;;;::::1;1386:48:::0;;::::1;1444:19;-1:-1:-1::0;;;1444:19:5::1;::::0;;;1334::::1;1538:15:::0;;;1334:5:::1;1538:15;::::0;;1563:33;;;1606:13;:39;;-1:-1:-1;;1606:39:5::1;::::0;;::::1;::::0;;;1538:15;1661:59;::::1;::::0;::::1;::::0;1579:17;5232:25:161;;5220:2;5205:18;;5086:177;1661:59:5::1;;;;;;;;1137:590;;3651:14:65::0;3647:99;;;3697:5;3681:21;;-1:-1:-1;;3681:21:65;;;3721:14;;-1:-1:-1;12067:36:161;;3721:14:65;;12055:2:161;12040:18;3721:14:65;;;;;;;3647:99;3269:483;984:743:5;;;:::o;3143:195:100:-;-1:-1:-1;;;;;1654:6:100;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:100;;;;;;;:::i;:::-;1751:6;-1:-1:-1;;;;;1727:30:100;:20;:18;:20::i;:::-;-1:-1:-1;;;;;1727:30:100;;1719:87;;;;-1:-1:-1;;;1719:87:100;;;;;;;:::i;:::-;3224:36:::1;3242:17;3224;:36::i;:::-;3311:12;::::0;;3321:1:::1;3311:12:::0;;;::::1;::::0;::::1;::::0;;;3270:61:::1;::::0;3292:17;;3311:12;3270:21:::1;:61::i;:::-;3143:195:::0;:::o;1844:253:26:-;2008:15;2046:44;2055:8;2065:5;2072:17;2046:8;:44::i;:::-;2039:51;1844:253;-1:-1:-1;;;;1844:253:26:o;3031:207:27:-;3075:10;:8;:10::i;:::-;3197:34;3213:10;3225:5;3197:15;:34::i;:::-;3031:207::o;3657:220:100:-;-1:-1:-1;;;;;1654:6:100;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:100;;;;;;;:::i;:::-;1751:6;-1:-1:-1;;;;;1727:30:100;:20;:18;:20::i;:::-;-1:-1:-1;;;;;1727:30:100;;1719:87;;;;-1:-1:-1;;;1719:87:100;;;;;;;:::i;:::-;3772:36:::1;3790:17;3772;:36::i;:::-;3818:52;3840:17;3859:4;3865;3818:21;:52::i;:::-;3657:220:::0;;:::o;2762:131::-;2840:7;2080:4;-1:-1:-1;;;;;2089:6:100;2072:23;;2064:92;;;;-1:-1:-1;;;2064:92:100;;13142:2:161;2064:92:100;;;13124:21:161;13181:2;13161:18;;;13154:30;13220:34;13200:18;;;13193:62;13291:26;13271:18;;;13264:54;13335:19;;2064:92:100;12940:420:161;2064:92:100;-1:-1:-1;;;;;;;;;;;;2762:131:100;:::o;2085:101:60:-;1355:13;:11;:13::i;:::-;2149:30:::1;2176:1;2149:18;:30::i;2031:212:59:-:0;1223:13;;965:10:82;;-1:-1:-1;;;;;1223:13:59;2130:24;;2122:78;;;;-1:-1:-1;;;2122:78:59;;13567:2:161;2122:78:59;;;13549:21:161;13606:2;13586:18;;;13579:30;13645:34;13625:18;;;13618:62;-1:-1:-1;;;13696:18:161;;;13689:39;13745:19;;2122:78:59;13365:405:161;2122:78:59;2210:26;2229:6;2210:18;:26::i;2784:202:27:-;2826:8;:6;:8::i;:::-;2946:33;2962:10;2974:4;2946:15;:33::i;3244:90::-;3281:7;3307:20;:18;:20::i;:::-;3300:27;;3244:90;:::o;1560:241:26:-;1699:15;1737:57;1753:13;1769:5;1776:17;1737:8;:57::i;:::-;1730:64;;1560:241;;;;;:::o;6571:513:5:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;6663:414:5;;;;;;;;6703:7;6663:414;;6841:10;6663:414;;;;7059:7;6663:414;;;;;;;;6571:513::o;1781:510::-;1951:40;521:1:27;2064:18;:16;:18::i;:::-;:27;;;2060:56;;2100:16;;-1:-1:-1;;;2100:16:27;;;;;;;;;;;2060:56;2126:24;521:1;2126:17;:24::i;:::-;2348:8:::1;3528::::0;;;;;:17;:8;521:1;3528:17;;3466:86;2348:8:::1;2344:43;;;2365:22;;-1:-1:-1::0;;;2365:22:27::1;;;;;;;;;;;2344:43;2012:9:5::2;2007:253;2027:15:::0;;::::2;2007:253;;;2063:22;2077:4;;2082:1;2077:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2063:13;:22::i;:::-;2044:3;;2007:253;;;-1:-1:-1::0;2270:14:5::2;2280:4:::0;;2270:14:::2;:::i;:::-;;;2171:25:27::0;482:1;2171:17;:25::i;1436:178:59:-;1355:13:60;:11;:13::i;:::-;1525::59::1;:24:::0;;-1:-1:-1;;;;;1525:24:59;::::1;-1:-1:-1::0;;;;;;1525:24:59;;::::1;::::0;::::1;::::0;;;1589:7:::1;1534:6:60::0;;-1:-1:-1;;;;;1534:6:60;;1462:85;1589:7:59::1;-1:-1:-1::0;;;;;1564:43:59::1;;;;;;;;;;;1436:178:::0;:::o;5115:288:27:-;5174:14;5204:43;5233:13;5204:28;:43::i;:::-;5200:197;;;-1:-1:-1;5308:13:27;5302:20;2762:131:100;:::o;5200:197:27:-;-1:-1:-1;5377:9:27;;;;5115:288;:::o;3884:237::-;4010:15;-1:-1:-1;;;;;2461:19:27;;2457:46;;2489:14;;-1:-1:-1;;;2489:14:27;;;;;;;;;;;2457:46;4041:24:::1;4058:6;4041:16;:24::i;:::-;4075:39;4098:15;4075:22;:39::i;:::-;3884:237:::0;;;:::o;1175:140:96:-;-1:-1:-1;;;;;;;;;;;1254:54:96;-1:-1:-1;;;;;1254:54:96;;1175:140::o;4619:75:27:-;1355:13:60;:11;:13::i;2494:922:96:-;689:66;2910:48;;;2906:504;;;2974:37;2993:17;2974:18;:37::i;2906:504::-;3064:17;-1:-1:-1;;;;;3046:50:96;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3046:52:96;;;;;;;;-1:-1:-1;;3046:52:96;;;;;;;;;;;;:::i;:::-;;;3042:291;;3262:56;;-1:-1:-1;;;3262:56:96;;17216:2:161;3262:56:96;;;17198:21:161;17255:2;17235:18;;;17228:30;17294:34;17274:18;;;17267:62;-1:-1:-1;;;17345:18:161;;;17338:44;17399:19;;3262:56:96;17014:410:161;3042:291:96;-1:-1:-1;;;;;;;;;;;3148:28:96;;3140:82;;;;-1:-1:-1;;;3140:82:96;;17631:2:161;3140:82:96;;;17613:21:161;17670:2;17650:18;;;17643:30;17709:34;17689:18;;;17682:62;-1:-1:-1;;;17760:18:161;;;17753:39;17809:19;;3140:82:96;17429:405:161;3140:82:96;3099:138;3346:53;3364:17;3383:4;3389:9;3346:17;:53::i;2864:524:26:-;3077:14;;3014:21;;-1:-1:-1;;;;;3077:14:26;;3101:68;;3143:26;;-1:-1:-1;;;3143:26:26;;;;;;;;;;;3101:68;3196:60;;-1:-1:-1;;;3196:60:26;;-1:-1:-1;;;;;18029:31:161;;3196:60:26;;;18011:50:161;18077:18;;;18070:34;;;-1:-1:-1;;;;;3196:43:26;;;;;17984:18:161;;3196:60:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3180:77;;3273:17;3272:18;:41;;;;-1:-1:-1;;;;;;3294:19:26;;;3272:41;3268:114;;;3336:35;;-1:-1:-1;;;3336:35:26;;-1:-1:-1;;;;;18029:31:161;;3336:35:26;;;18011:50:161;18077:18;;;18070:34;;;17984:18;;3336:35:26;17839:271:161;3268:114:26;3041:347;2864:524;;;;;:::o;4454:159:27:-;2246:8;3528;;;;;:17;:8;521:1;3528:17;;3466:86;2246:8;2241:44;;2263:22;;-1:-1:-1;;;2263:22:27;;;;;;;;;;;2241:44;4504:8:::1;:17:::0;;::::1;-1:-1:-1::0;;4531:40:27;;;;4555:15:::1;-1:-1:-1::0;;;;;4531:40:27::1;;::::0;;;;4586:20:::1;::::0;4595:10:::1;3315:51:161::0;;4586:20:27::1;::::0;3303:2:161;3288:18;4586:20:27::1;;;;;;;;4454:159::o:0;4700:70::-;1355:13:60;1620:130;1534:6;;-1:-1:-1;;;;;1534:6:60;965:10:82;1683:23:60;1675:68;;;;-1:-1:-1;;;1675:68:60;;18573:2:161;1675:68:60;;;18555:21:161;;;18592:18;;;18585:30;18651:34;18631:18;;;18624:62;18703:18;;1675:68:60;18371:356:161;1798:153:59;1887:13;1880:20;;-1:-1:-1;;;;;;1880:20:59;;;1910:34;1935:8;1910:24;:34::i;4341:107:27:-;2348:8;3528;;;;;:17;:8;521:1;3528:17;;3466:86;2348:8;2344:43;;;2365:22;;-1:-1:-1;;;2365:22:27;;;;;;;;;;;2344:43;4392:8:::1;:16:::0;;-1:-1:-1;;4392:16:27::1;::::0;::::1;::::0;;4423:18:::1;::::0;4430:10:::1;3315:51:161::0;;4423:18:27::1;::::0;3303:2:161;3288:18;4423::27::1;3169:203:161::0;4807:272:27;4881:43;4910:13;4881:28;:43::i;:::-;4877:196;;;4989:8;4974:13;4967:31;3143:195:100;:::o;4877:196:27:-;5042:9;:20;;;;;-1:-1:-1;;5042:20:27;;;;;;4807:272;:::o;2415:3692:5:-;6063:20;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6038:62:5;;6091:6;6038:62;;;;;;:::i;:::-;;;;;;;;2415:3692;:::o;2377:235:34:-;2445:4;140:1;2468:8;:30;:64;;;;353:6;2502:8;:30;2468:64;:110;;;;401:10;2548:8;:30;2468:110;:137;;;;2582:23;2596:8;2582:13;:23::i;4127:208:27:-;5374:13:65;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:65;;;;;;;:::i;:::-;4213:16:27::1;:14;:16::i;:::-;4239:62;-1:-1:-1::0;;;;;4258:20:27;::::1;::::0;:42:::1;;4294:6;4239:18;:62::i;4258:42::-;4281:10;4239:18;:62::i;:::-;-1:-1:-1::0;4311:8:27::1;:17:::0;;-1:-1:-1;;4311:17:27::1;;;::::0;;4127:208::o;2241:248:26:-;5374:13:65;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:65;;;;;;;:::i;:::-;-1:-1:-1;;;;;2346:13:26::1;:32;2342:99;;;2401:29;;-1:-1:-1::0;;;2401:29:26::1;;;;;;;;;;;2342:99;2450:14;:32:::0;;-1:-1:-1;;;;;;2450:32:26::1;-1:-1:-1::0;;;;;2450:32:26;;;::::1;::::0;;;::::1;::::0;;2241:248::o;1406:259:96:-;-1:-1:-1;;;;;1713:19:81;;;1479:95:96;;;;-1:-1:-1;;;1479:95:96;;22420:2:161;1479:95:96;;;22402:21:161;22459:2;22439:18;;;22432:30;22498:34;22478:18;;;22471:62;-1:-1:-1;;;22549:18:161;;;22542:43;22602:19;;1479:95:96;22218:409:161;1479:95:96;-1:-1:-1;;;;;;;;;;;1584:74:96;;-1:-1:-1;;;;;;1584:74:96;-1:-1:-1;;;;;1584:74:96;;;;;;;;;;1406:259::o;2057:265::-;2165:29;2176:17;2165:10;:29::i;:::-;2222:1;2208:4;:11;:15;:28;;;;2227:9;2208:28;2204:112;;;2252:53;2281:17;2300:4;2252:28;:53::i;2687:187:60:-;2779:6;;;-1:-1:-1;;;;;2795:17:60;;;-1:-1:-1;;;;;;2795:17:60;;;;;;;2827:40;;2779:6;;;2795:17;2779:6;;2827:40;;2760:16;;2827:40;2750:124;2687:187;:::o;2003:134:34:-;2067:4;2102:6;2090:8;:18;;:40;;;;-1:-1:-1;;2124:6:34;-1:-1:-1;2112:18:34;;2003:134::o;747:59:82:-;5374:13:65;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:65;;;;;;;:::i;1771:152:96:-;1837:37;1856:17;1837:18;:37::i;:::-;1889:27;;-1:-1:-1;;;;;1889:27:96;;;;;;;;1771:152;:::o;6674:198:114:-;6757:12;6788:77;6809:6;6817:4;6788:77;;;;;;;;;;;;;;;;;7199:12;7224;7238:23;7265:6;-1:-1:-1;;;;;7265:19:114;7285:4;7265:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7223:67;;;;7307:69;7334:6;7342:7;7351:10;7363:12;7307:26;:69::i;:::-;7300:76;7058:325;-1:-1:-1;;;;;;7058:325:114:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1713:19:81;;;8113:60:114;;;;-1:-1:-1;;;8113:60:114;;23126:2:161;8113:60:114;;;23108:21:161;23165:2;23145:18;;;23138:30;23204:31;23184:18;;;23177:59;23253:18;;8113:60:114;22924:353:161;8113:60:114;-1:-1:-1;8208:10:114;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;-1:-1:-1;;;9324:20:114;;;;;;;;:::i;14:127:161:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:255;218:2;212:9;260:6;248:19;;-1:-1:-1;;;;;282:34:161;;318:22;;;279:62;276:88;;;344:18;;:::i;:::-;380:2;373:22;146:255;:::o;406:275::-;477:2;471:9;542:2;523:13;;-1:-1:-1;;519:27:161;507:40;;-1:-1:-1;;;;;562:34:161;;598:22;;;559:62;556:88;;;624:18;;:::i;:::-;660:2;653:22;406:275;;-1:-1:-1;406:275:161:o;686:171::-;753:20;;-1:-1:-1;;;;;802:30:161;;792:41;;782:69;;847:1;844;837:12;782:69;686:171;;;:::o;862:163::-;929:20;;989:10;978:22;;968:33;;958:61;;1015:1;1012;1005:12;1030:161;1097:20;;1157:8;1146:20;;1136:31;;1126:59;;1181:1;1178;1171:12;1196:583;1278:6;1331:2;1319:9;1310:7;1306:23;1302:32;1299:52;;;1347:1;1344;1337:12;1299:52;1380:2;1374:9;1422:2;1414:6;1410:15;1491:6;1479:10;1476:22;-1:-1:-1;;;;;1443:10:161;1440:34;1437:62;1434:88;;;1502:18;;:::i;:::-;1538:2;1531:22;1577:28;1595:9;1577:28;:::i;:::-;1569:6;1562:44;1639:37;1672:2;1661:9;1657:18;1639:37;:::i;:::-;1634:2;1626:6;1622:15;1615:62;1710:37;1743:2;1732:9;1728:18;1710:37;:::i;:::-;1705:2;1693:15;;1686:62;1697:6;1196:583;-1:-1:-1;;;1196:583:161:o;2072:131::-;-1:-1:-1;;;;;2147:31:161;;2137:42;;2127:70;;2193:1;2190;2183:12;2208:134;2276:20;;2305:31;2276:20;2305:31;:::i;2347:456::-;2424:6;2432;2440;2493:2;2481:9;2472:7;2468:23;2464:32;2461:52;;;2509:1;2506;2499:12;2461:52;2548:9;2535:23;2567:31;2592:5;2567:31;:::i;:::-;2617:5;-1:-1:-1;2674:2:161;2659:18;;2646:32;2687:33;2646:32;2687:33;:::i;:::-;2347:456;;2739:7;;-1:-1:-1;;;2793:2:161;2778:18;;;;2765:32;;2347:456::o;2808:247::-;2867:6;2920:2;2908:9;2899:7;2895:23;2891:32;2888:52;;;2936:1;2933;2926:12;2888:52;2975:9;2962:23;2994:31;3019:5;2994:31;:::i;:::-;3044:5;2808:247;-1:-1:-1;;;2808:247:161:o;3377:160::-;3442:20;;3498:13;;3491:21;3481:32;;3471:60;;3527:1;3524;3517:12;3542:320;3615:6;3623;3631;3684:2;3672:9;3663:7;3659:23;3655:32;3652:52;;;3700:1;3697;3690:12;3652:52;3723:28;3741:9;3723:28;:::i;:::-;3713:38;;3798:2;3787:9;3783:18;3770:32;3760:42;;3821:35;3852:2;3841:9;3837:18;3821:35;:::i;:::-;3811:45;;3542:320;;;;;:::o;4091:530::-;4133:5;4186:3;4179:4;4171:6;4167:17;4163:27;4153:55;;4204:1;4201;4194:12;4153:55;4240:6;4227:20;-1:-1:-1;;;;;4262:2:161;4259:26;4256:52;;;4288:18;;:::i;:::-;4332:55;4375:2;4356:13;;-1:-1:-1;;4352:27:161;4381:4;4348:38;4332:55;:::i;:::-;4412:2;4403:7;4396:19;4458:3;4451:4;4446:2;4438:6;4434:15;4430:26;4427:35;4424:55;;;4475:1;4472;4465:12;4424:55;4540:2;4533:4;4525:6;4521:17;4514:4;4505:7;4501:18;4488:55;4588:1;4563:16;;;4581:4;4559:27;4552:38;;;;4567:7;4091:530;-1:-1:-1;;;4091:530:161:o;4626:455::-;4703:6;4711;4764:2;4752:9;4743:7;4739:23;4735:32;4732:52;;;4780:1;4777;4770:12;4732:52;4819:9;4806:23;4838:31;4863:5;4838:31;:::i;:::-;4888:5;-1:-1:-1;4944:2:161;4929:18;;4916:32;-1:-1:-1;;;;;4960:30:161;;4957:50;;;5003:1;5000;4993:12;4957:50;5026:49;5067:7;5058:6;5047:9;5043:22;5026:49;:::i;:::-;5016:59;;;4626:455;;;;;:::o;5450:248::-;5515:6;5523;5576:2;5564:9;5555:7;5551:23;5547:32;5544:52;;;5592:1;5589;5582:12;5544:52;5628:9;5615:23;5605:33;;5657:35;5688:2;5677:9;5673:18;5657:35;:::i;:::-;5647:45;;5450:248;;;;;:::o;7251:647::-;7369:6;7377;7430:2;7418:9;7409:7;7405:23;7401:32;7398:52;;;7446:1;7443;7436:12;7398:52;7486:9;7473:23;-1:-1:-1;;;;;7556:2:161;7548:6;7545:14;7542:34;;;7572:1;7569;7562:12;7542:34;7610:6;7599:9;7595:22;7585:32;;7655:7;7648:4;7644:2;7640:13;7636:27;7626:55;;7677:1;7674;7667:12;7626:55;7717:2;7704:16;7743:2;7735:6;7732:14;7729:34;;;7759:1;7756;7749:12;7729:34;7812:7;7807:2;7797:6;7794:1;7790:14;7786:2;7782:23;7778:32;7775:45;7772:65;;;7833:1;7830;7823:12;7772:65;7864:2;7856:11;;;;;7886:6;;-1:-1:-1;7251:647:161;;-1:-1:-1;;;;7251:647:161:o;7903:250::-;7988:1;7998:113;8012:6;8009:1;8006:13;7998:113;;;8088:11;;;8082:18;8069:11;;;8062:39;8034:2;8027:10;7998:113;;;-1:-1:-1;;8145:1:161;8127:16;;8120:27;7903:250::o;8158:270::-;8199:3;8237:5;8231:12;8264:6;8259:3;8252:19;8280:76;8349:6;8342:4;8337:3;8333:14;8326:4;8319:5;8315:16;8280:76;:::i;:::-;8410:2;8389:15;-1:-1:-1;;8385:29:161;8376:39;;;;8417:4;8372:50;;8158:270;-1:-1:-1;;8158:270:161:o;8433:2719::-;8635:4;8664:2;8704;8693:9;8689:18;8734:2;8723:9;8716:21;8757:6;8792;8786:13;8823:6;8815;8808:22;8849:2;8839:12;;8882:2;8871:9;8867:18;8860:25;;8944:2;8934:6;8931:1;8927:14;8916:9;8912:30;8908:39;8982:2;8974:6;8970:15;9003:1;9013:2110;9027:6;9024:1;9021:13;9013:2110;;;9092:22;;;-1:-1:-1;;9088:36:161;9076:49;;9148:13;;9218:9;;9203:25;;9271:11;;;9265:18;9248:15;;;9241:43;9327:11;;;9321:18;9304:15;;;9297:43;9363:4;9410:11;;;9404:18;9387:15;;;9380:43;9446:4;9493:11;;;9487:18;9470:15;;;9463:43;9529:4;9576:11;;;9570:18;9553:15;;;9546:43;9612:4;9659:11;;;9653:18;9636:15;;;9629:43;9695:4;9738:11;;;9732:18;-1:-1:-1;;;;;3126:31:161;9796:15;;;3114:44;9836:6;9883:12;;;9877:19;-1:-1:-1;;;;;5768:30:161;;;9943:16;;;5756:43;;;;9984:6;10031:12;;;10025:19;6508:10;6497:22;;;10091:16;;;6485:35;;;;10132:6;10179:12;;;10173:19;6497:22;;;10239:16;;;6485:35;10280:6;10327:12;;;10321:19;5768:30;;;10387:16;;;5756:43;10428:6;10475:12;;;10469:19;6607:8;6596:20;;;10535:16;;;6584:33;;;;10576:6;10623:12;;;10617:19;6596:20;;;10683:16;;;6584:33;10724:6;10771:12;;;10765:19;1854:13;1847:21;10829:16;;;1835:34;10870:6;10917:12;;;10911:19;9184:6;10950:16;;;10943:28;;;10911:19;10994:49;11027:15;;;10911:19;10994:49;:::i;:::-;11101:12;;;;10984:59;-1:-1:-1;;;11066:15:161;;;;9049:1;9042:9;9013:2110;;;-1:-1:-1;11140:6:161;;8433:2719;-1:-1:-1;;;;;;;;8433:2719:161:o;12114:408::-;12316:2;12298:21;;;12355:2;12335:18;;;12328:30;12394:34;12389:2;12374:18;;12367:62;-1:-1:-1;;;12460:2:161;12445:18;;12438:42;12512:3;12497:19;;12114:408::o;12527:::-;12729:2;12711:21;;;12768:2;12748:18;;;12741:30;12807:34;12802:2;12787:18;;12780:62;-1:-1:-1;;;12873:2:161;12858:18;;12851:42;12925:3;12910:19;;12527:408::o;13775:127::-;13836:10;13831:3;13827:20;13824:1;13817:31;13867:4;13864:1;13857:15;13891:4;13888:1;13881:15;13907:330;14005:4;14063:11;14050:25;14157:3;14153:8;14142;14126:14;14122:29;14118:44;14098:18;14094:69;14084:97;;14177:1;14174;14167:12;14084:97;14198:33;;;;;13907:330;-1:-1:-1;;13907:330:161:o;14242:2578::-;14420:9;-1:-1:-1;;;;;14495:2:161;14487:6;14484:14;14481:40;;;14501:18;;:::i;:::-;14547:6;14544:1;14540:14;14573:4;14597:28;14621:2;14617;14613:11;14597:28;:::i;:::-;14659:19;;;14729:14;;;;14694:12;;;;14766:14;14755:26;;14752:46;;;14794:1;14791;14784:12;14752:46;14818:5;14832:1955;14848:6;14843:3;14840:15;14832:1955;;;14934:3;14921:17;14970:2;14957:11;14954:19;14951:39;;;14986:1;14983;14976:12;14951:39;15013:23;;15081:6;15060:14;15056:23;;;15052:36;15049:56;;;15101:1;15098;15091:12;15049:56;15133:22;;:::i;:::-;15184:16;;15168:33;;15252:11;;;15239:25;15221:16;;;15214:51;15288:2;15341:11;;;15328:25;15310:16;;;15303:51;15377:2;15430:11;;;15417:25;15399:16;;;15392:51;15466:3;15520:11;;;15507:25;15489:16;;;15482:51;15556:3;15610:11;;;15597:25;15579:16;;;15572:51;15646:3;15700:11;;;15687:25;15669:16;;;15662:51;15737:3;15779:32;15798:12;;;15779:32;:::i;:::-;15760:17;;;15753:59;15836:3;15878:31;15896:12;;;15878:31;:::i;:::-;15859:17;;;15852:58;15934:3;15976:31;15994:12;;;15976:31;:::i;:::-;15957:17;;;15950:58;16032:3;16074:31;16092:12;;;16074:31;:::i;:::-;16055:17;;;16048:58;16130:3;16172:31;16190:12;;;16172:31;:::i;:::-;16153:17;;;16146:58;16228:3;16270:31;16288:12;;;16270:31;:::i;:::-;16251:17;;;16244:58;16326:3;16368:31;16386:12;;;16368:31;:::i;:::-;16349:17;;;16342:58;16424:3;16466:29;16482:12;;;16466:29;:::i;:::-;16447:17;;;16440:56;16520:3;16563:12;;;16550:26;16592:14;;;16589:34;;;16619:1;16616;16609:12;16589:34;16662:49;16696:14;16687:6;16683:2;16679:15;16662:49;:::i;:::-;16643:17;;;16636:76;;;;-1:-1:-1;16725:20:161;;-1:-1:-1;16765:12:161;;;;14865;;14832:1955;;;-1:-1:-1;16809:5:161;14242:2578;-1:-1:-1;;;;;;;14242:2578:161:o;16825:184::-;16895:6;16948:2;16936:9;16927:7;16923:23;16919:32;16916:52;;;16964:1;16961;16954:12;16916:52;-1:-1:-1;16987:16:161;;16825:184;-1:-1:-1;16825:184:161:o;18115:251::-;18185:6;18238:2;18226:9;18217:7;18213:23;18209:32;18206:52;;;18254:1;18251;18244:12;18206:52;18286:9;18280:16;18305:31;18330:5;18305:31;:::i;18732:184::-;18790:6;18843:2;18831:9;18822:7;18818:23;18814:32;18811:52;;;18859:1;18856;18849:12;18811:52;18882:28;18900:9;18882:28;:::i;18921:500::-;18979:5;18986:6;19046:3;19033:17;19132:2;19128:7;19117:8;19101:14;19097:29;19093:43;19073:18;19069:68;19059:96;;19151:1;19148;19141:12;19059:96;19179:33;;19283:4;19270:18;;;-1:-1:-1;19231:21:161;;-1:-1:-1;;;;;;19300:30:161;;19297:50;;;19343:1;19340;19333:12;19297:50;19390:6;19374:14;19370:27;19363:5;19359:39;19356:59;;;19411:1;19408;19401:12;19356:59;18921:500;;;;;:::o;19426:266::-;19514:6;19509:3;19502:19;19566:6;19559:5;19552:4;19547:3;19543:14;19530:43;-1:-1:-1;19618:1:161;19593:16;;;19611:4;19589:27;;;19582:38;;;;19674:2;19653:15;;;-1:-1:-1;;19649:29:161;19640:39;;;19636:50;;19426:266::o;19697:2104::-;19888:2;19877:9;19870:21;19940:6;19927:20;19922:2;19911:9;19907:18;19900:48;20009:2;20001:6;19997:15;19984:29;19979:2;19968:9;19964:18;19957:57;20075:2;20067:6;20063:15;20050:29;20045:2;20034:9;20030:18;20023:57;20142:2;20134:6;20130:15;20117:29;20111:3;20100:9;20096:19;20089:58;20209:3;20201:6;20197:16;20184:30;20178:3;20167:9;20163:19;20156:59;20277:3;20269:6;20265:16;20252:30;20246:3;20235:9;20231:19;20224:59;20345:3;20337:6;20333:16;20320:30;20314:3;20303:9;20299:19;20292:59;19851:4;20380:36;20411:3;20403:6;20399:16;20380:36;:::i;:::-;20435:3;20447:52;20495:2;20484:9;20480:18;20466:12;-1:-1:-1;;;;;3126:31:161;3114:44;;3060:104;20447:52;20530:34;20560:2;20552:6;20548:15;20530:34;:::i;:::-;20508:56;;;20583:3;20595:53;20644:2;20633:9;20629:18;20613:14;-1:-1:-1;;;;;5768:30:161;5756:43;;5703:102;20595:53;20679:34;20709:2;20701:6;20697:15;20679:34;:::i;:::-;20657:56;;;20732:3;20744:53;20793:2;20782:9;20778:18;20762:14;6508:10;6497:22;6485:35;;6432:94;20744:53;20828:34;20858:2;20850:6;20846:15;20828:34;:::i;:::-;20806:56;;;20881:3;20893:53;20942:2;20931:9;20927:18;20911:14;6508:10;6497:22;6485:35;;6432:94;20893:53;20977:34;21007:2;20999:6;20995:15;20977:34;:::i;:::-;20955:56;;;21030:3;21042:53;21091:2;21080:9;21076:18;21060:14;-1:-1:-1;;;;;5768:30:161;5756:43;;5703:102;21042:53;21126:34;21156:2;21148:6;21144:15;21126:34;:::i;:::-;21104:56;;;21179:3;21191:53;21240:2;21229:9;21225:18;21209:14;6607:8;6596:20;6584:33;;6531:92;21191:53;21275:34;21305:2;21297:6;21293:15;21275:34;:::i;:::-;21253:56;;;21328:3;21340:53;21389:2;21378:9;21374:18;21358:14;6607:8;6596:20;6584:33;;6531:92;21340:53;21424:32;21452:2;21444:6;21440:15;21424:32;:::i;:::-;21402:54;;;21475:3;21487:51;21534:2;21523:9;21519:18;21503:14;1854:13;1847:21;1835:34;;1784:91;21487:51;21583:55;21634:2;21626:6;21622:15;21614:6;21583:55;:::i;:::-;21657:6;21679:18;;;21672:30;21547:91;-1:-1:-1;21547:91:161;-1:-1:-1;21719:76:161;21790:3;21775:19;;21547:91;;21719:76;:::i;:::-;21711:84;19697:2104;-1:-1:-1;;;;;19697:2104:161:o;21806:407::-;22008:2;21990:21;;;22047:2;22027:18;;;22020:30;22086:34;22081:2;22066:18;;22059:62;-1:-1:-1;;;22152:2:161;22137:18;;22130:41;22203:3;22188:19;;21806:407::o;22632:287::-;22761:3;22799:6;22793:13;22815:66;22874:6;22869:3;22862:4;22854:6;22850:17;22815:66;:::i;23282:219::-;23431:2;23420:9;23413:21;23394:4;23451:44;23491:2;23480:9;23476:18;23468:6;23451:44;:::i","linkReferences":{},"immutableReferences":{"24016":[{"start":1938,"length":32},{"start":2002,"length":32},{"start":2177,"length":32},{"start":2241,"length":32},{"start":2364,"length":32}]}},"methodIdentifiers":{"MAX_BYTES_PER_BLOB()":"81e3925f","SECURITY_DELAY_AFTER_PROVEN()":"6b5ad7e0","acceptOwnership()":"79ba5097","addressManager()":"3ab76e9f","getConfig()":"c3f909d4","impl()":"8abf6077","inNonReentrant()":"3075db56","init(address,address,bytes32)":"347258aa","isConfigValid((uint64,uint32,uint24))":"10f3ab1b","lastUnpausedAt()":"e07baba6","owner()":"8da5cb5b","pause()":"8456cb59","paused()":"5c975abb","pendingOwner()":"e30c3978","proposeBlock((bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,address,uint64,uint32,uint32,uint64,uint24,uint24,bool,bytes)[])":"e2faea2b","proxiableUUID()":"52d1902d","renounceOwnership()":"715018a6","resolve(bytes32,bool)":"a86f9d9e","resolve(uint64,bytes32,bool)":"3eb6b8cf","state()":"c19d93fb","transferOwnership(address)":"f2fde38b","unpause()":"3f4ba83a","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FUNC_NOT_IMPLEMENTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"INVALID_PAUSE_STATUS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ALREADY_CONTESTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ALREADY_PROVED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOB_FOR_DA_DISABLED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOB_NOT_FOUND\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOB_NOT_REUSEABLE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOCK_MISMATCH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INCORRECT_BLOCK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INSUFFICIENT_TOKEN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_ADDRESS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_AMOUNT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_BLOCK_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_CONFIG\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_ETH_DEPOSIT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_L1_STATE_BLOCK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_OR_DUPLICATE_VERIFIER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PARAM\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PAUSE_STATUS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PROPOSER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_TIER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_TIMESTAMP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_TRANSITION\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROPOSER_NOT_EOA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROVING_PAUSED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_RECEIVE_DISABLED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TOO_MANY_BLOCKS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TOO_MANY_TIERS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TRANSITION_ID_ZERO\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TRANSITION_NOT_FOUND\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TXLIST_OFFSET_SIZE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TXLIST_TOO_LARGE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_UNAUTHORIZED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_UNEXPECTED_PARENT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_UNEXPECTED_TRANSITION_TIER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"REENTRANT_CALL\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_DENIED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_INVALID_MANAGER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainId\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"name\",\"type\":\"bytes32\"}],\"name\":\"RESOLVER_ZERO_ADDR\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZERO_ADDRESS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZERO_VALUE\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentMetaHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blobHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"extraData\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"l2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"l1StateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint24\",\"name\":\"txListByteOffset\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"txListByteSize\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"blobUsed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"struct TaikoData.BlockMetadata\",\"name\":\"meta\",\"type\":\"tuple\"}],\"name\":\"BlockProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"name\":\"BlockVerified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"}],\"name\":\"ProvingPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"parentBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"struct TaikoData.Transition\",\"name\":\"tran\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prover\",\"type\":\"address\"}],\"name\":\"TransitionProved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_BYTES_PER_BLOB\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SECURITY_DELAY_AFTER_PROVEN\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"blockMaxTxListBytes\",\"type\":\"uint24\"}],\"internalType\":\"struct TaikoData.Config\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"impl\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inNonReentrant\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"blockMaxTxListBytes\",\"type\":\"uint24\"}],\"internalType\":\"struct TaikoData.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"isConfigValid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUnpausedAt\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentMetaHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blobHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"extraData\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"l2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"l1StateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint24\",\"name\":\"txListByteOffset\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"txListByteSize\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"blobUsed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"}],\"internalType\":\"struct TaikoData.BlockMetadata[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"name\":\"proposeBlock\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentMetaHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blobHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"extraData\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"l2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"l1StateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint24\",\"name\":\"txListByteOffset\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"txListByteSize\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"blobUsed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"}],\"internalType\":\"struct TaikoData.BlockMetadata[]\",\"name\":\"_blocks\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainId\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_name\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_name\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"state\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"genesisHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"genesisTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"numBlocks\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"provingPaused\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"lastUnpausedAt\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"BlockProposed(uint256,(bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,address,uint64,uint32,uint32,uint64,uint24,uint24,bool,bytes))\":{\"details\":\"Emitted when a block is proposed.\",\"params\":{\"blockId\":\"The ID of the proposed block.\",\"meta\":\"The block metadata containing information about the proposed block.\"}},\"BlockVerified(uint256,bytes32)\":{\"details\":\"Emitted when a block is verified.\",\"params\":{\"blockHash\":\"The hash of the verified block.\",\"blockId\":\"The ID of the verified block.\"}},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Paused(address)\":{\"params\":{\"account\":\"The account that paused the contract.\"}},\"TransitionProved(uint256,(bytes32,bytes32),address)\":{\"details\":\"Emitted when a block transition is proved or re-proved.\"},\"Unpaused(address)\":{\"params\":{\"account\":\"The account that unpaused the contract.\"}},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"getConfig()\":{\"returns\":{\"_0\":\"Config struct containing configuration parameters.\"}},\"init(address,address,bytes32)\":{\"params\":{\"_addressManager\":\"The {AddressManager} address.\",\"_genesisBlockHash\":\"The block hash of the genesis block.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"returns\":{\"_0\":\"true if paused, false otherwise.\"}},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"proposeBlock((bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,address,uint64,uint32,uint32,uint64,uint24,uint24,bool,bytes)[])\":{\"details\":\"Proposes multiple Taiko L2 blocks.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"resolve(bytes32,bool)\":{\"params\":{\"_allowZeroAddress\":\"If set to true, does not throw if the resolved address is `address(0)`.\",\"_name\":\"Name whose address is to be resolved.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"resolve(uint64,bytes32,bool)\":{\"params\":{\"_allowZeroAddress\":\"If set to true, does not throw if the resolved address is `address(0)`.\",\"_chainId\":\"The chainId of interest.\",\"_name\":\"Name whose address is to be resolved.\"},\"returns\":{\"_0\":\"Address associated with the given name on the specified chain.\"}},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"TaikoL1\",\"version\":1},\"userdoc\":{\"events\":{\"Paused(address)\":{\"notice\":\"Emitted when the contract is paused.\"},\"Unpaused(address)\":{\"notice\":\"Emitted when the contract is unpaused.\"}},\"kind\":\"user\",\"methods\":{\"addressManager()\":{\"notice\":\"Address of the AddressManager.\"},\"getConfig()\":{\"notice\":\"Gets the configuration of the TaikoL1 contract.\"},\"init(address,address,bytes32)\":{\"notice\":\"Initializes the rollup.\"},\"pause()\":{\"notice\":\"Pauses the contract.\"},\"paused()\":{\"notice\":\"Returns true if the contract is paused, and false otherwise.\"},\"resolve(bytes32,bool)\":{\"notice\":\"Resolves a name to its address deployed on this chain.\"},\"resolve(uint64,bytes32,bool)\":{\"notice\":\"Resolves a name to its address deployed on a specified chain.\"},\"unpause()\":{\"notice\":\"Unpauses the contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/TaikoL1.sol\":\"TaikoL1\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":p256-verifier/=node_modules/p256-verifier/\",\":solady/=node_modules/solady/\",\":solmate/=node_modules/solmate/src/\"]},\"sources\":{\"contracts/L1/TaikoData.sol\":{\"keccak256\":\"0x5e319d3ba05d33b0fa6955c07c5e2c41795809d347df00fe62ebb454cb459489\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f95047076c3d8adb488e1f38440617ab526e3882e589d46972b96a7b74d98c56\",\"dweb:/ipfs/QmUGm4eoK617oViFDs9TQFxYYZXmWnDw1knqDY9JJUFCZb\"]},\"contracts/L1/TaikoErrors.sol\":{\"keccak256\":\"0x7d1c24557fd5d59bc24d350eeac7b9b5156f3816535d7414dd32eb97f2aa9bf2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92d84503e0117af0d2df1eecc7ad6b90319114fe8312a1eae0d2409ca5ced968\",\"dweb:/ipfs/QmRraNzpSGxU9AFFReLGcCEngDqtwrYvS3y7wu66vQXRcd\"]},\"contracts/L1/TaikoEvents.sol\":{\"keccak256\":\"0x4b3212ed4ffae9fa6cb6e77dfab3abba378b7c4cc7f77cc44348bdc6e48dd916\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4bb2736107feddfa8a2cf27c753008314b0bd647f40d6441bf530037329f639\",\"dweb:/ipfs/QmdxDjLXorDcL3Kaq1hStRCPBCzPom8KiMXCMudC1p3Loy\"]},\"contracts/L1/TaikoL1.sol\":{\"keccak256\":\"0x25dfe4c1fed165ff3be1fc1aca584afaafebff7562d576a2b5bd46b2f4a9fae1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16a5f02adf3d362e7e4c2bb827da7b5ab0934379021f1a42b71e017783cc75e2\",\"dweb:/ipfs/QmSibycifDqN7opkGn8rS6Xinx55NYDiHQv7wHpCNqKDja\"]},\"contracts/L1/preconfs/ISequencerRegistry.sol\":{\"keccak256\":\"0x940d1e6293d53246d6b467969cea7945a2dec698b8d43b269ab3c2558c9da6c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bafcedadd442709754a785a1c79e3c89036a83949686f58f23fb94e664996c0\",\"dweb:/ipfs/QmPnkvhPvYd4ALkpeA4gHWdjqqwjDr848Lm9pstsCSpQp4\"]},\"contracts/common/AddressResolver.sol\":{\"keccak256\":\"0xd1a5f2483f289b551c6f7ddc8ac56ea897ab634e1a821c151bb2ac6f4d449368\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://569ce06d944a73a66ff4345e769169254d06859858a2f5574a2caa5345cc1932\",\"dweb:/ipfs/Qma6wbCurte9ZEaPgoeyvhzgzw2KR2ok3Hn3tt6Skb9san\"]},\"contracts/common/EssentialContract.sol\":{\"keccak256\":\"0x843db2ea54ffd5f1ad137564e0d29db3c3e8a1e26801f71c1bd82b3e556c5a0a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2924468c472427fa53ec4360d0f96ef40fe9df4deea80d2a35bc6dee573fe81f\",\"dweb:/ipfs/QmXe8Vn4x5CJeUgJq43fgafrSbhRad9Y6NVrSPwYeJhDVR\"]},\"contracts/common/IAddressManager.sol\":{\"keccak256\":\"0x169642ab5b6fd6f555b68a9e9d553e34e71c1b61d02c26f68cb1cc0fa2124578\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://41141b4001dd3df0bd0daa5023318de7fdde82ad44450210495cadc0020745c6\",\"dweb:/ipfs/QmZZEmQww2DMyCQ6v7nqAKwun4XjRvgUXtfkbUTJ2cZkty\"]},\"contracts/common/IAddressResolver.sol\":{\"keccak256\":\"0xa7dbf8f4a541b9aefaf7f2626b8d775908d1f99e68be9890ce3ff6aabc7be291\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://30c6c584a8a1928ebcc07a13825a3219d4d35b0a68f4d75e31c8c34cc5adf3d1\",\"dweb:/ipfs/QmSmGCW2zvjueMUpoVmyC4BdEyHVns4TCd3GLfMjyoCcch\"]},\"contracts/libs/LibNetwork.sol\":{\"keccak256\":\"0x4a1f465396e0807a53308033de0521739fbaf6c3c14557f4da1471f8fa1139b0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1a3a55911962a68c9bf418abe34664c968ee3f70804bedab945767c503a82fc\",\"dweb:/ipfs/QmW7ojvrV3m6WNsNJUqzs4DKiB1HMYGH8y8cTe77XVbCmM\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0x9140dabc466abab21b48b72dbda26736b1183a310d0e677d3719d201df026510\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://75267b14b60dc216d01d596a4008189a6c44d3314e53eded0edb1e757d95be16\",\"dweb:/ipfs/QmQoMaxTRT6V7uQj9USfdQH9jh1crywB9auVjThzUSAbG2\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x359a1ab89b46b9aba7bcad3fb651924baf4893d15153049b9976b0fc9be1358e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e89863421b4014b96a4b62be76eb3b9f0a8afe9684664a6f389124c0964bfe5c\",\"dweb:/ipfs/Qmbk7xr1irpDuU1WdxXgxELBXxs61rHhCgod7heVcvFx16\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b06267c5f80bad727af3e48b1382333d591dad51376399ef2f6b0ee6d58bf95\",\"dweb:/ipfs/QmdU5La1agcQvghnfMpWZGDPz2TUDTCxUwTLKmuMRXBpAx\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol\":{\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e8fa670c3bdce78e642cc6ae11c4cb38b133499cdce5e1990a9979d424703263\",\"dweb:/ipfs/QmVxeCUk4jL2pXQyhsoNJwyU874wRufS2WvGe8TgPKPqhE\"]},\"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688\",\"dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr\"]},\"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2db8e18505e86e02526847005d7287a33e397ed7fb9eaba3fd4a4a197add16e2\",\"dweb:/ipfs/QmW9BSuKTzHWHBNSHF4L8XfVuU1uJrP2vLg84YtBd8mL82\"]},\"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"node_modules/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0xc6619957bcc6641fe8984bfaf9ff11a9e4b97d8149c0495f608f9a2416d7c5cf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://543be67f7fa43b1b932637c1c7f12035f0f4b0f7ee2bd3c33841186f79c165c1\",\"dweb:/ipfs/QmSBPM2UVKbmJqWfD9i6hSiqbaE8TV4TSqfuiivziRRLKM\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931\",\"dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da\",\"dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"FUNC_NOT_IMPLEMENTED"},{"inputs":[],"type":"error","name":"INVALID_PAUSE_STATUS"},{"inputs":[],"type":"error","name":"L1_ALREADY_CONTESTED"},{"inputs":[],"type":"error","name":"L1_ALREADY_PROVED"},{"inputs":[],"type":"error","name":"L1_ASSIGNED_PROVER_NOT_ALLOWED"},{"inputs":[],"type":"error","name":"L1_BLOB_FOR_DA_DISABLED"},{"inputs":[],"type":"error","name":"L1_BLOB_NOT_FOUND"},{"inputs":[],"type":"error","name":"L1_BLOB_NOT_REUSEABLE"},{"inputs":[],"type":"error","name":"L1_BLOCK_MISMATCH"},{"inputs":[],"type":"error","name":"L1_INCORRECT_BLOCK"},{"inputs":[],"type":"error","name":"L1_INSUFFICIENT_TOKEN"},{"inputs":[],"type":"error","name":"L1_INVALID_ADDRESS"},{"inputs":[],"type":"error","name":"L1_INVALID_AMOUNT"},{"inputs":[],"type":"error","name":"L1_INVALID_BLOCK_ID"},{"inputs":[],"type":"error","name":"L1_INVALID_CONFIG"},{"inputs":[],"type":"error","name":"L1_INVALID_ETH_DEPOSIT"},{"inputs":[],"type":"error","name":"L1_INVALID_L1_STATE_BLOCK"},{"inputs":[],"type":"error","name":"L1_INVALID_OR_DUPLICATE_VERIFIER"},{"inputs":[],"type":"error","name":"L1_INVALID_PARAM"},{"inputs":[],"type":"error","name":"L1_INVALID_PAUSE_STATUS"},{"inputs":[],"type":"error","name":"L1_INVALID_PROOF"},{"inputs":[],"type":"error","name":"L1_INVALID_PROPOSER"},{"inputs":[],"type":"error","name":"L1_INVALID_PROVER"},{"inputs":[],"type":"error","name":"L1_INVALID_TIER"},{"inputs":[],"type":"error","name":"L1_INVALID_TIMESTAMP"},{"inputs":[],"type":"error","name":"L1_INVALID_TRANSITION"},{"inputs":[],"type":"error","name":"L1_LIVENESS_BOND_NOT_RECEIVED"},{"inputs":[],"type":"error","name":"L1_NOT_ASSIGNED_PROVER"},{"inputs":[],"type":"error","name":"L1_PROPOSER_NOT_EOA"},{"inputs":[],"type":"error","name":"L1_PROVING_PAUSED"},{"inputs":[],"type":"error","name":"L1_RECEIVE_DISABLED"},{"inputs":[],"type":"error","name":"L1_TOO_MANY_BLOCKS"},{"inputs":[],"type":"error","name":"L1_TOO_MANY_TIERS"},{"inputs":[],"type":"error","name":"L1_TRANSITION_ID_ZERO"},{"inputs":[],"type":"error","name":"L1_TRANSITION_NOT_FOUND"},{"inputs":[],"type":"error","name":"L1_TXLIST_OFFSET_SIZE"},{"inputs":[],"type":"error","name":"L1_TXLIST_TOO_LARGE"},{"inputs":[],"type":"error","name":"L1_UNAUTHORIZED"},{"inputs":[],"type":"error","name":"L1_UNEXPECTED_PARENT"},{"inputs":[],"type":"error","name":"L1_UNEXPECTED_TRANSITION_ID"},{"inputs":[],"type":"error","name":"L1_UNEXPECTED_TRANSITION_TIER"},{"inputs":[],"type":"error","name":"REENTRANT_CALL"},{"inputs":[],"type":"error","name":"RESOLVER_DENIED"},{"inputs":[],"type":"error","name":"RESOLVER_INVALID_MANAGER"},{"inputs":[],"type":"error","name":"RESOLVER_UNEXPECTED_CHAINID"},{"inputs":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"type":"error","name":"RESOLVER_ZERO_ADDR"},{"inputs":[],"type":"error","name":"ZERO_ADDRESS"},{"inputs":[],"type":"error","name":"ZERO_VALUE"},{"inputs":[{"internalType":"address","name":"previousAdmin","type":"address","indexed":false},{"internalType":"address","name":"newAdmin","type":"address","indexed":false}],"type":"event","name":"AdminChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"beacon","type":"address","indexed":true}],"type":"event","name":"BeaconUpgraded","anonymous":false},{"inputs":[{"internalType":"uint256","name":"blockId","type":"uint256","indexed":true},{"internalType":"struct TaikoData.BlockMetadata","name":"meta","type":"tuple","components":[{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentMetaHash","type":"bytes32"},{"internalType":"bytes32","name":"l1Hash","type":"bytes32"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"bytes32","name":"blobHash","type":"bytes32"},{"internalType":"bytes32","name":"extraData","type":"bytes32"},{"internalType":"address","name":"coinbase","type":"address"},{"internalType":"uint64","name":"l2BlockNumber","type":"uint64"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"uint32","name":"l1StateBlockNumber","type":"uint32"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint24","name":"txListByteOffset","type":"uint24"},{"internalType":"uint24","name":"txListByteSize","type":"uint24"},{"internalType":"bool","name":"blobUsed","type":"bool"},{"internalType":"bytes","name":"txList","type":"bytes"}],"indexed":false}],"type":"event","name":"BlockProposed","anonymous":false},{"inputs":[{"internalType":"uint256","name":"blockId","type":"uint256","indexed":true},{"internalType":"bytes32","name":"blockHash","type":"bytes32","indexed":false}],"type":"event","name":"BlockVerified","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferStarted","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"bool","name":"paused","type":"bool","indexed":false}],"type":"event","name":"ProvingPaused","anonymous":false},{"inputs":[{"internalType":"uint256","name":"blockId","type":"uint256","indexed":true},{"internalType":"struct TaikoData.Transition","name":"tran","type":"tuple","components":[{"internalType":"bytes32","name":"parentBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"}],"indexed":false},{"internalType":"address","name":"prover","type":"address","indexed":false}],"type":"event","name":"TransitionProved","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BYTES_PER_BLOB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"SECURITY_DELAY_AFTER_PROVEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"acceptOwnership"},{"inputs":[],"stateMutability":"view","type":"function","name":"addressManager","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getConfig","outputs":[{"internalType":"struct TaikoData.Config","name":"","type":"tuple","components":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint32","name":"blockMaxGasLimit","type":"uint32"},{"internalType":"uint24","name":"blockMaxTxListBytes","type":"uint24"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"impl","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"inNonReentrant","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_addressManager","type":"address"},{"internalType":"bytes32","name":"_genesisBlockHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"init"},{"inputs":[{"internalType":"struct TaikoData.Config","name":"config","type":"tuple","components":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint32","name":"blockMaxGasLimit","type":"uint32"},{"internalType":"uint24","name":"blockMaxTxListBytes","type":"uint24"}]}],"stateMutability":"pure","type":"function","name":"isConfigValid","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"lastUnpausedAt","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"pause"},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"struct TaikoData.BlockMetadata[]","name":"data","type":"tuple[]","components":[{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentMetaHash","type":"bytes32"},{"internalType":"bytes32","name":"l1Hash","type":"bytes32"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"bytes32","name":"blobHash","type":"bytes32"},{"internalType":"bytes32","name":"extraData","type":"bytes32"},{"internalType":"address","name":"coinbase","type":"address"},{"internalType":"uint64","name":"l2BlockNumber","type":"uint64"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"uint32","name":"l1StateBlockNumber","type":"uint32"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint24","name":"txListByteOffset","type":"uint24"},{"internalType":"uint24","name":"txListByteSize","type":"uint24"},{"internalType":"bool","name":"blobUsed","type":"bool"},{"internalType":"bytes","name":"txList","type":"bytes"}]}],"stateMutability":"payable","type":"function","name":"proposeBlock","outputs":[{"internalType":"struct TaikoData.BlockMetadata[]","name":"_blocks","type":"tuple[]","components":[{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentMetaHash","type":"bytes32"},{"internalType":"bytes32","name":"l1Hash","type":"bytes32"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"bytes32","name":"blobHash","type":"bytes32"},{"internalType":"bytes32","name":"extraData","type":"bytes32"},{"internalType":"address","name":"coinbase","type":"address"},{"internalType":"uint64","name":"l2BlockNumber","type":"uint64"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"uint32","name":"l1StateBlockNumber","type":"uint32"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint24","name":"txListByteOffset","type":"uint24"},{"internalType":"uint24","name":"txListByteSize","type":"uint24"},{"internalType":"bool","name":"blobUsed","type":"bool"},{"internalType":"bytes","name":"txList","type":"bytes"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"uint64","name":"_chainId","type":"uint64"},{"internalType":"bytes32","name":"_name","type":"bytes32"},{"internalType":"bool","name":"_allowZeroAddress","type":"bool"}],"stateMutability":"view","type":"function","name":"resolve","outputs":[{"internalType":"address payable","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"_name","type":"bytes32"},{"internalType":"bool","name":"_allowZeroAddress","type":"bool"}],"stateMutability":"view","type":"function","name":"resolve","outputs":[{"internalType":"address payable","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"state","outputs":[{"internalType":"uint64","name":"genesisHeight","type":"uint64"},{"internalType":"uint64","name":"genesisTimestamp","type":"uint64"},{"internalType":"uint64","name":"numBlocks","type":"uint64"},{"internalType":"uint64","name":"lastVerifiedBlockId","type":"uint64"},{"internalType":"bool","name":"provingPaused","type":"bool"},{"internalType":"uint64","name":"lastUnpausedAt","type":"uint64"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"unpause"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"upgradeTo"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"}],"devdoc":{"kind":"dev","methods":{"acceptOwnership()":{"details":"The new owner accepts the ownership transfer."},"getConfig()":{"returns":{"_0":"Config struct containing configuration parameters."}},"init(address,address,bytes32)":{"params":{"_addressManager":"The {AddressManager} address.","_genesisBlockHash":"The block hash of the genesis block."}},"owner()":{"details":"Returns the address of the current owner."},"paused()":{"returns":{"_0":"true if paused, false otherwise."}},"pendingOwner()":{"details":"Returns the address of the pending owner."},"proposeBlock((bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,address,uint64,uint32,uint32,uint64,uint24,uint24,bool,bytes)[])":{"details":"Proposes multiple Taiko L2 blocks."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"resolve(bytes32,bool)":{"params":{"_allowZeroAddress":"If set to true, does not throw if the resolved address is `address(0)`.","_name":"Name whose address is to be resolved."},"returns":{"_0":"Address associated with the given name."}},"resolve(uint64,bytes32,bool)":{"params":{"_allowZeroAddress":"If set to true, does not throw if the resolved address is `address(0)`.","_chainId":"The chainId of interest.","_name":"Name whose address is to be resolved."},"returns":{"_0":"Address associated with the given name on the specified chain."}},"transferOwnership(address)":{"details":"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner."},"upgradeTo(address)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"version":1},"userdoc":{"kind":"user","methods":{"addressManager()":{"notice":"Address of the AddressManager."},"getConfig()":{"notice":"Gets the configuration of the TaikoL1 contract."},"init(address,address,bytes32)":{"notice":"Initializes the rollup."},"pause()":{"notice":"Pauses the contract."},"paused()":{"notice":"Returns true if the contract is paused, and false otherwise."},"resolve(bytes32,bool)":{"notice":"Resolves a name to its address deployed on this chain."},"resolve(uint64,bytes32,bool)":{"notice":"Resolves a name to its address deployed on a specified chain."},"unpause()":{"notice":"Unpauses the contract."}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","p256-verifier/=node_modules/p256-verifier/","solady/=node_modules/solady/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"contracts/L1/TaikoL1.sol":"TaikoL1"},"evmVersion":"cancun","libraries":{}},"sources":{"contracts/L1/TaikoData.sol":{"keccak256":"0x5e319d3ba05d33b0fa6955c07c5e2c41795809d347df00fe62ebb454cb459489","urls":["bzz-raw://f95047076c3d8adb488e1f38440617ab526e3882e589d46972b96a7b74d98c56","dweb:/ipfs/QmUGm4eoK617oViFDs9TQFxYYZXmWnDw1knqDY9JJUFCZb"],"license":"MIT"},"contracts/L1/TaikoErrors.sol":{"keccak256":"0x7d1c24557fd5d59bc24d350eeac7b9b5156f3816535d7414dd32eb97f2aa9bf2","urls":["bzz-raw://92d84503e0117af0d2df1eecc7ad6b90319114fe8312a1eae0d2409ca5ced968","dweb:/ipfs/QmRraNzpSGxU9AFFReLGcCEngDqtwrYvS3y7wu66vQXRcd"],"license":"MIT"},"contracts/L1/TaikoEvents.sol":{"keccak256":"0x4b3212ed4ffae9fa6cb6e77dfab3abba378b7c4cc7f77cc44348bdc6e48dd916","urls":["bzz-raw://c4bb2736107feddfa8a2cf27c753008314b0bd647f40d6441bf530037329f639","dweb:/ipfs/QmdxDjLXorDcL3Kaq1hStRCPBCzPom8KiMXCMudC1p3Loy"],"license":"MIT"},"contracts/L1/TaikoL1.sol":{"keccak256":"0x25dfe4c1fed165ff3be1fc1aca584afaafebff7562d576a2b5bd46b2f4a9fae1","urls":["bzz-raw://16a5f02adf3d362e7e4c2bb827da7b5ab0934379021f1a42b71e017783cc75e2","dweb:/ipfs/QmSibycifDqN7opkGn8rS6Xinx55NYDiHQv7wHpCNqKDja"],"license":"MIT"},"contracts/L1/preconfs/ISequencerRegistry.sol":{"keccak256":"0x940d1e6293d53246d6b467969cea7945a2dec698b8d43b269ab3c2558c9da6c5","urls":["bzz-raw://7bafcedadd442709754a785a1c79e3c89036a83949686f58f23fb94e664996c0","dweb:/ipfs/QmPnkvhPvYd4ALkpeA4gHWdjqqwjDr848Lm9pstsCSpQp4"],"license":"MIT"},"contracts/common/AddressResolver.sol":{"keccak256":"0xd1a5f2483f289b551c6f7ddc8ac56ea897ab634e1a821c151bb2ac6f4d449368","urls":["bzz-raw://569ce06d944a73a66ff4345e769169254d06859858a2f5574a2caa5345cc1932","dweb:/ipfs/Qma6wbCurte9ZEaPgoeyvhzgzw2KR2ok3Hn3tt6Skb9san"],"license":"MIT"},"contracts/common/EssentialContract.sol":{"keccak256":"0x843db2ea54ffd5f1ad137564e0d29db3c3e8a1e26801f71c1bd82b3e556c5a0a","urls":["bzz-raw://2924468c472427fa53ec4360d0f96ef40fe9df4deea80d2a35bc6dee573fe81f","dweb:/ipfs/QmXe8Vn4x5CJeUgJq43fgafrSbhRad9Y6NVrSPwYeJhDVR"],"license":"MIT"},"contracts/common/IAddressManager.sol":{"keccak256":"0x169642ab5b6fd6f555b68a9e9d553e34e71c1b61d02c26f68cb1cc0fa2124578","urls":["bzz-raw://41141b4001dd3df0bd0daa5023318de7fdde82ad44450210495cadc0020745c6","dweb:/ipfs/QmZZEmQww2DMyCQ6v7nqAKwun4XjRvgUXtfkbUTJ2cZkty"],"license":"MIT"},"contracts/common/IAddressResolver.sol":{"keccak256":"0xa7dbf8f4a541b9aefaf7f2626b8d775908d1f99e68be9890ce3ff6aabc7be291","urls":["bzz-raw://30c6c584a8a1928ebcc07a13825a3219d4d35b0a68f4d75e31c8c34cc5adf3d1","dweb:/ipfs/QmSmGCW2zvjueMUpoVmyC4BdEyHVns4TCd3GLfMjyoCcch"],"license":"MIT"},"contracts/libs/LibNetwork.sol":{"keccak256":"0x4a1f465396e0807a53308033de0521739fbaf6c3c14557f4da1471f8fa1139b0","urls":["bzz-raw://a1a3a55911962a68c9bf418abe34664c968ee3f70804bedab945767c503a82fc","dweb:/ipfs/QmW7ojvrV3m6WNsNJUqzs4DKiB1HMYGH8y8cTe77XVbCmM"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol":{"keccak256":"0x9140dabc466abab21b48b72dbda26736b1183a310d0e677d3719d201df026510","urls":["bzz-raw://75267b14b60dc216d01d596a4008189a6c44d3314e53eded0edb1e757d95be16","dweb:/ipfs/QmQoMaxTRT6V7uQj9USfdQH9jh1crywB9auVjThzUSAbG2"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"keccak256":"0x359a1ab89b46b9aba7bcad3fb651924baf4893d15153049b9976b0fc9be1358e","urls":["bzz-raw://e89863421b4014b96a4b62be76eb3b9f0a8afe9684664a6f389124c0964bfe5c","dweb:/ipfs/Qmbk7xr1irpDuU1WdxXgxELBXxs61rHhCgod7heVcvFx16"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794","urls":["bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e","dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"keccak256":"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422","urls":["bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b","dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef","urls":["bzz-raw://8b06267c5f80bad727af3e48b1382333d591dad51376399ef2f6b0ee6d58bf95","dweb:/ipfs/QmdU5La1agcQvghnfMpWZGDPz2TUDTCxUwTLKmuMRXBpAx"],"license":"MIT"},"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol":{"keccak256":"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90","urls":["bzz-raw://e8fa670c3bdce78e642cc6ae11c4cb38b133499cdce5e1990a9979d424703263","dweb:/ipfs/QmVxeCUk4jL2pXQyhsoNJwyU874wRufS2WvGe8TgPKPqhE"],"license":"MIT"},"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff","urls":["bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688","dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"keccak256":"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2","urls":["bzz-raw://2db8e18505e86e02526847005d7287a33e397ed7fb9eaba3fd4a4a197add16e2","dweb:/ipfs/QmW9BSuKTzHWHBNSHF4L8XfVuU1uJrP2vLg84YtBd8mL82"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0xc6619957bcc6641fe8984bfaf9ff11a9e4b97d8149c0495f608f9a2416d7c5cf","urls":["bzz-raw://543be67f7fa43b1b932637c1c7f12035f0f4b0f7ee2bd3c33841186f79c165c1","dweb:/ipfs/QmSBPM2UVKbmJqWfD9i6hSiqbaE8TV4TSqfuiivziRRLKM"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa","urls":["bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931","dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899","urls":["bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da","dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q"],"license":"MIT"}},"version":1},"id":5} \ No newline at end of file +{"abi":[{"type":"function","name":"MAX_BYTES_PER_BLOB","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"SECURITY_DELAY_AFTER_PROVEN","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"acceptOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addressManager","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getConfig","inputs":[],"outputs":[{"name":"","type":"tuple","internalType":"struct TaikoData.Config","components":[{"name":"chainId","type":"uint64","internalType":"uint64"},{"name":"blockMaxGasLimit","type":"uint32","internalType":"uint32"},{"name":"blockMaxTxListBytes","type":"uint24","internalType":"uint24"}]}],"stateMutability":"view"},{"type":"function","name":"impl","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"inNonReentrant","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"init","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_addressManager","type":"address","internalType":"address"},{"name":"_genesisBlockHash","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isConfigValid","inputs":[{"name":"config","type":"tuple","internalType":"struct TaikoData.Config","components":[{"name":"chainId","type":"uint64","internalType":"uint64"},{"name":"blockMaxGasLimit","type":"uint32","internalType":"uint32"},{"name":"blockMaxTxListBytes","type":"uint24","internalType":"uint24"}]}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"type":"function","name":"lastUnpausedAt","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"pause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"pendingOwner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proposeBlock","inputs":[{"name":"data","type":"tuple[]","internalType":"struct TaikoData.BlockMetadata[]","components":[{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentBlockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentMetaHash","type":"bytes32","internalType":"bytes32"},{"name":"l1Hash","type":"bytes32","internalType":"bytes32"},{"name":"difficulty","type":"uint256","internalType":"uint256"},{"name":"blobHash","type":"bytes32","internalType":"bytes32"},{"name":"extraData","type":"bytes32","internalType":"bytes32"},{"name":"coinbase","type":"address","internalType":"address"},{"name":"l2BlockNumber","type":"uint64","internalType":"uint64"},{"name":"gasLimit","type":"uint32","internalType":"uint32"},{"name":"l1StateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"timestamp","type":"uint64","internalType":"uint64"},{"name":"txListByteOffset","type":"uint24","internalType":"uint24"},{"name":"txListByteSize","type":"uint24","internalType":"uint24"},{"name":"blobUsed","type":"bool","internalType":"bool"},{"name":"txList","type":"bytes","internalType":"bytes"},{"name":"stateDiffs","type":"bytes","internalType":"bytes"},{"name":"l1StateDiff","type":"tuple","internalType":"struct TaikoData.StateDiff","components":[{"name":"accounts","type":"tuple[]","internalType":"struct TaikoData.StateDiffAccount[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"slots","type":"tuple[]","internalType":"struct TaikoData.StateDiffStorageSlot[]","components":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"value","type":"bytes32","internalType":"bytes32"}]}]}]}]}],"outputs":[{"name":"_blocks","type":"tuple[]","internalType":"struct TaikoData.BlockMetadata[]","components":[{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentBlockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentMetaHash","type":"bytes32","internalType":"bytes32"},{"name":"l1Hash","type":"bytes32","internalType":"bytes32"},{"name":"difficulty","type":"uint256","internalType":"uint256"},{"name":"blobHash","type":"bytes32","internalType":"bytes32"},{"name":"extraData","type":"bytes32","internalType":"bytes32"},{"name":"coinbase","type":"address","internalType":"address"},{"name":"l2BlockNumber","type":"uint64","internalType":"uint64"},{"name":"gasLimit","type":"uint32","internalType":"uint32"},{"name":"l1StateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"timestamp","type":"uint64","internalType":"uint64"},{"name":"txListByteOffset","type":"uint24","internalType":"uint24"},{"name":"txListByteSize","type":"uint24","internalType":"uint24"},{"name":"blobUsed","type":"bool","internalType":"bool"},{"name":"txList","type":"bytes","internalType":"bytes"},{"name":"stateDiffs","type":"bytes","internalType":"bytes"},{"name":"l1StateDiff","type":"tuple","internalType":"struct TaikoData.StateDiff","components":[{"name":"accounts","type":"tuple[]","internalType":"struct TaikoData.StateDiffAccount[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"slots","type":"tuple[]","internalType":"struct TaikoData.StateDiffStorageSlot[]","components":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"value","type":"bytes32","internalType":"bytes32"}]}]}]}]}],"stateMutability":"payable"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resolve","inputs":[{"name":"_chainId","type":"uint64","internalType":"uint64"},{"name":"_name","type":"bytes32","internalType":"bytes32"},{"name":"_allowZeroAddress","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"view"},{"type":"function","name":"resolve","inputs":[{"name":"_name","type":"bytes32","internalType":"bytes32"},{"name":"_allowZeroAddress","type":"bool","internalType":"bool"}],"outputs":[{"name":"","type":"address","internalType":"address payable"}],"stateMutability":"view"},{"type":"function","name":"state","inputs":[],"outputs":[{"name":"genesisHeight","type":"uint64","internalType":"uint64"},{"name":"genesisTimestamp","type":"uint64","internalType":"uint64"},{"name":"numBlocks","type":"uint64","internalType":"uint64"},{"name":"lastVerifiedBlockId","type":"uint64","internalType":"uint64"},{"name":"provingPaused","type":"bool","internalType":"bool"},{"name":"lastUnpausedAt","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"unpause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"BlockProposed","inputs":[{"name":"blockId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"meta","type":"tuple","indexed":false,"internalType":"struct TaikoData.BlockMetadata","components":[{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentBlockHash","type":"bytes32","internalType":"bytes32"},{"name":"parentMetaHash","type":"bytes32","internalType":"bytes32"},{"name":"l1Hash","type":"bytes32","internalType":"bytes32"},{"name":"difficulty","type":"uint256","internalType":"uint256"},{"name":"blobHash","type":"bytes32","internalType":"bytes32"},{"name":"extraData","type":"bytes32","internalType":"bytes32"},{"name":"coinbase","type":"address","internalType":"address"},{"name":"l2BlockNumber","type":"uint64","internalType":"uint64"},{"name":"gasLimit","type":"uint32","internalType":"uint32"},{"name":"l1StateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"timestamp","type":"uint64","internalType":"uint64"},{"name":"txListByteOffset","type":"uint24","internalType":"uint24"},{"name":"txListByteSize","type":"uint24","internalType":"uint24"},{"name":"blobUsed","type":"bool","internalType":"bool"},{"name":"txList","type":"bytes","internalType":"bytes"},{"name":"stateDiffs","type":"bytes","internalType":"bytes"},{"name":"l1StateDiff","type":"tuple","internalType":"struct TaikoData.StateDiff","components":[{"name":"accounts","type":"tuple[]","internalType":"struct TaikoData.StateDiffAccount[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"slots","type":"tuple[]","internalType":"struct TaikoData.StateDiffStorageSlot[]","components":[{"name":"key","type":"bytes32","internalType":"bytes32"},{"name":"value","type":"bytes32","internalType":"bytes32"}]}]}]}]}],"anonymous":false},{"type":"event","name":"BlockVerified","inputs":[{"name":"blockId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"blockHash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferStarted","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ProvingPaused","inputs":[{"name":"paused","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"TransitionProved","inputs":[{"name":"blockId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"tran","type":"tuple","indexed":false,"internalType":"struct TaikoData.Transition","components":[{"name":"parentBlockHash","type":"bytes32","internalType":"bytes32"},{"name":"blockHash","type":"bytes32","internalType":"bytes32"}]},{"name":"prover","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"FUNC_NOT_IMPLEMENTED","inputs":[]},{"type":"error","name":"INVALID_PAUSE_STATUS","inputs":[]},{"type":"error","name":"L1_ALREADY_CONTESTED","inputs":[]},{"type":"error","name":"L1_ALREADY_PROVED","inputs":[]},{"type":"error","name":"L1_ASSIGNED_PROVER_NOT_ALLOWED","inputs":[]},{"type":"error","name":"L1_BLOB_FOR_DA_DISABLED","inputs":[]},{"type":"error","name":"L1_BLOB_NOT_FOUND","inputs":[]},{"type":"error","name":"L1_BLOB_NOT_REUSEABLE","inputs":[]},{"type":"error","name":"L1_BLOCK_MISMATCH","inputs":[]},{"type":"error","name":"L1_INCORRECT_BLOCK","inputs":[]},{"type":"error","name":"L1_INSUFFICIENT_TOKEN","inputs":[]},{"type":"error","name":"L1_INVALID_ADDRESS","inputs":[]},{"type":"error","name":"L1_INVALID_AMOUNT","inputs":[]},{"type":"error","name":"L1_INVALID_BLOCK_ID","inputs":[]},{"type":"error","name":"L1_INVALID_CONFIG","inputs":[]},{"type":"error","name":"L1_INVALID_ETH_DEPOSIT","inputs":[]},{"type":"error","name":"L1_INVALID_L1_STATE_BLOCK","inputs":[]},{"type":"error","name":"L1_INVALID_OR_DUPLICATE_VERIFIER","inputs":[]},{"type":"error","name":"L1_INVALID_PARAM","inputs":[]},{"type":"error","name":"L1_INVALID_PAUSE_STATUS","inputs":[]},{"type":"error","name":"L1_INVALID_PROOF","inputs":[]},{"type":"error","name":"L1_INVALID_PROPOSER","inputs":[]},{"type":"error","name":"L1_INVALID_PROVER","inputs":[]},{"type":"error","name":"L1_INVALID_TIER","inputs":[]},{"type":"error","name":"L1_INVALID_TIMESTAMP","inputs":[]},{"type":"error","name":"L1_INVALID_TRANSITION","inputs":[]},{"type":"error","name":"L1_LIVENESS_BOND_NOT_RECEIVED","inputs":[]},{"type":"error","name":"L1_NOT_ASSIGNED_PROVER","inputs":[]},{"type":"error","name":"L1_PROPOSER_NOT_EOA","inputs":[]},{"type":"error","name":"L1_PROVING_PAUSED","inputs":[]},{"type":"error","name":"L1_RECEIVE_DISABLED","inputs":[]},{"type":"error","name":"L1_TOO_MANY_BLOCKS","inputs":[]},{"type":"error","name":"L1_TOO_MANY_TIERS","inputs":[]},{"type":"error","name":"L1_TRANSITION_ID_ZERO","inputs":[]},{"type":"error","name":"L1_TRANSITION_NOT_FOUND","inputs":[]},{"type":"error","name":"L1_TXLIST_OFFSET_SIZE","inputs":[]},{"type":"error","name":"L1_TXLIST_TOO_LARGE","inputs":[]},{"type":"error","name":"L1_UNAUTHORIZED","inputs":[]},{"type":"error","name":"L1_UNEXPECTED_PARENT","inputs":[]},{"type":"error","name":"L1_UNEXPECTED_TRANSITION_ID","inputs":[]},{"type":"error","name":"L1_UNEXPECTED_TRANSITION_TIER","inputs":[]},{"type":"error","name":"REENTRANT_CALL","inputs":[]},{"type":"error","name":"RESOLVER_DENIED","inputs":[]},{"type":"error","name":"RESOLVER_INVALID_MANAGER","inputs":[]},{"type":"error","name":"RESOLVER_UNEXPECTED_CHAINID","inputs":[]},{"type":"error","name":"RESOLVER_ZERO_ADDR","inputs":[{"name":"chainId","type":"uint64","internalType":"uint64"},{"name":"name","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ZERO_ADDRESS","inputs":[]},{"type":"error","name":"ZERO_VALUE","inputs":[]}],"bytecode":{"object":"0x60a06040523060805234801562000014575f80fd5b506200001f6200002f565b620000296200002f565b620000ed565b5f54610100900460ff16156200009b5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000eb575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516125cd620001225f395f8181610792015281816107d201528181610881015281816108c1015261093c01526125cd5ff3fe608060405260043610610147575f3560e01c8063715018a6116100b3578063a86f9d9e1161006d578063a86f9d9e1461034a578063c19d93fb14610369578063c3f909d4146103fb578063e07baba614610445578063e30c397814610482578063f2fde38b1461049f575f80fd5b8063715018a6146102c757806379ba5097146102db57806381e3925f146102ef5780638456cb59146103055780638abf6077146103195780638da5cb5b1461032d575f80fd5b80633f4ba83a116101045780633f4ba83a146102295780634f1ef2861461023d57806352d1902d146102505780635c975abb1461027257806365cfd675146102925780636b5ad7e0146102b2575f80fd5b806310f3ab1b1461014b5780633075db561461017f578063347258aa146101935780633659cfe6146101b45780633ab76e9f146101d35780633eb6b8cf1461020a575b5f80fd5b348015610156575f80fd5b5061016a6101653660046116ec565b6104be565b60405190151581526020015b60405180910390f35b34801561018a575f80fd5b5061016a61051f565b34801561019e575f80fd5b506101b26101ad366004611774565b610533565b005b3480156101bf575f80fd5b506101b26101ce3660046117b2565b610788565b3480156101de575f80fd5b506097546101f2906001600160a01b031681565b6040516001600160a01b039091168152602001610176565b348015610215575f80fd5b506101f26102243660046117dc565b61084f565b348015610234575f80fd5b506101b2610863565b6101b261024b366004611880565b610877565b34801561025b575f80fd5b50610264610930565b604051908152602001610176565b34801561027d575f80fd5b5061016a60c954610100900460ff1660021490565b6102a56102a03660046118cc565b6109e1565b6040516101769190611a36565b3480156102bd575f80fd5b5061026461708081565b3480156102d2575f80fd5b506101b2610aa5565b3480156102e6575f80fd5b506101b2610ab6565b3480156102fa575f80fd5b506102646202000081565b348015610310575f80fd5b506101b2610b2d565b348015610324575f80fd5b506101f2610b40565b348015610338575f80fd5b506033546001600160a01b03166101f2565b348015610355575f80fd5b506101f2610364366004611bb5565b610b4e565b348015610374575f80fd5b5060fd5460fe546103b9916001600160401b0380821692600160401b8304821692600160801b8104831692600160c01b90910481169160ff8116916101009091041686565b604080516001600160401b03978816815295871660208701529386169385019390935290841660608401521515608083015290911660a082015260c001610176565b348015610406575f80fd5b5061040f610b61565b6040805182516001600160401b0316815260208084015163ffffffff16908201529181015162ffffff1690820152606001610176565b348015610450575f80fd5b5060c95461046a906201000090046001600160401b031681565b6040516001600160401b039091168152602001610176565b34801561048d575f80fd5b506065546001600160a01b03166101f2565b3480156104aa575f80fd5b506101b26104b93660046117b2565b610ba5565b5f6001825f01516001600160401b03161115806104e35750602082015163ffffffff16155b806104f55750604082015162ffffff16155b8061050b575062020000826040015162ffffff16115b1561051757505f919050565b506001919050565b5f600261052a610c16565b60ff1614905090565b5f54610100900460ff161580801561055157505f54600160ff909116105b8061056a5750303b15801561056a57505f5460ff166001145b6105d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156105f3575f805461ff0019166101001790555b6105fd8484610c55565b5f610606610b61565b9050610611816104be565b61064e5760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420636f6e66696760901b60448201526064016105c9565b60fd805467ffffffffffffffff60801b19426001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff19909316439190911617821716600160801b179091555f80805260fb6020527fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d89758581557fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d897780546fffffffffffffffff000000000000000019169093179092556040517f68b82650828a9621868d09dc161400acbe189fa002e3fb7cf9dea5c2c6f928ee906107339087815260200190565b60405180910390a250508015610782575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036107d05760405162461bcd60e51b81526004016105c990611bdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610802610c94565b6001600160a01b0316146108285760405162461bcd60e51b81526004016105c990611c2b565b61083181610caf565b604080515f8082526020820190925261084c91839190610cb7565b50565b5f61085b848484610e21565b949350505050565b61086b610f12565b610875335f610fa2565b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108bf5760405162461bcd60e51b81526004016105c990611bdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108f1610c94565b6001600160a01b0316146109175760405162461bcd60e51b81526004016105c990611c2b565b61092082610caf565b61092c82826001610cb7565b5050565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109cf5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016105c9565b505f8051602061255183398151915290565b606060026109ed610c16565b60ff1603610a0e5760405163dfc60d8560e01b815260040160405180910390fd5b610a186002610faa565b610a2c60c954610100900460ff1660021490565b15610a4a5760405163bae6e2a960e01b815260040160405180910390fd5b5f5b82811015610a8857610a80848483818110610a6957610a69611c77565b9050602002810190610a7b9190611c8b565b610ff2565b600101610a4c565b50610a938284611e58565b9050610a9f6001610faa565b92915050565b610aad61115f565b6108755f6111b9565b60655433906001600160a01b03168114610b245760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016105c9565b61084c816111b9565b610b356111d2565b610875336001610fa2565b5f610b49610c94565b905090565b5f610b5a468484610e21565b9392505050565b604080516060810182525f8082526020820181905291810191909152506040805160608101825262028c60815262e4e1c060208201526201d4c09181019190915290565b610bad61115f565b606580546001600160a01b0383166001600160a01b03199091168117909155610bde6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f610c2046611243565b15610c4b57507fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5c90565b5060c95460ff1690565b806001600160a01b038116610c7d5760405163538ba4f960e01b815260040160405180910390fd5b610c8683611270565b610c8f826112ce565b505050565b5f80516020612551833981519152546001600160a01b031690565b61084c61115f565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610cea57610c8f8361133e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610d44575060408051601f3d908101601f19168201909252610d4191810190612018565b60015b610da75760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016105c9565b5f805160206125518339815191528114610e155760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016105c9565b50610c8f8383836113d9565b6097545f906001600160a01b031680610e4d57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0386166004820152602481018590526001600160a01b038216906328f713cc90604401602060405180830381865afa158015610e9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec3919061202f565b915082158015610eda57506001600160a01b038216155b15610f0a57604051632b0d65db60e01b81526001600160401b0386166004820152602481018590526044016105c9565b509392505050565b610f2660c954610100900460ff1660021490565b610f435760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b61092c61115f565b610fb346611243565b15610fde57807fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5d50565b60c9805460ff831660ff1990911617905550565b5f5b61100261022083018361204a565b61100c908061205e565b90508110156111095761102361022083018361204a565b61102d908061205e565b8281811061103d5761103d611c77565b905060200281019061104f91906120aa565b61105d9060208101906117b2565b6001600160a01b031663307c30dd61107961022085018561204a565b611083908061205e565b8481811061109357611093611c77565b90506020028101906110a591906120aa565b6110b39060208101906120be565b6040518363ffffffff1660e01b81526004016110d0929190612142565b5f604051808303815f87803b1580156110e7575f80fd5b505af11580156110f9573d5f803e3d5ffd5b505060019092019150610ff49050565b5061111c61012082016101008301612155565b6001600160401b03167fbfbd11d93a0da0bb42e73cc53fbaab5714fa7d372abcf795303cfe3a57722498826040516111549190612303565b60405180910390a250565b6033546001600160a01b031633146108755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c9565b606580546001600160a01b031916905561084c816113fd565b6111e660c954610100900460ff1660021490565b156112045760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610f98565b5f6001821480611254575061426882145b80611261575062aa36a782145b80610a9f5750610a9f8261144e565b5f54610100900460ff166112965760405162461bcd60e51b81526004016105c9906124e2565b61129e611465565b6112bc6001600160a01b038216156112b657816111b9565b336111b9565b5060c9805461ff001916610100179055565b5f54610100900460ff166112f45760405162461bcd60e51b81526004016105c9906124e2565b6001600160401b0346111561131c5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381163b6113ab5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016105c9565b5f8051602061255183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6113e28361148b565b5f825111806113ee5750805b15610c8f5761078283836114ca565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f617e2c8210158015610a9f575050617e90101590565b5f54610100900460ff166108755760405162461bcd60e51b81526004016105c9906124e2565b6114948161133e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610b5a83836040518060600160405280602781526020016125716027913960605f80856001600160a01b031685604051611506919061252d565b5f60405180830381855af49150503d805f811461153e576040519150601f19603f3d011682016040523d82523d5f602084013e611543565b606091505b50915091506115548683838761155e565b9695505050505050565b606083156115cc5782515f036115c5576001600160a01b0385163b6115c55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105c9565b508161085b565b61085b83838151156115e15781518083602001fd5b8060405162461bcd60e51b81526004016105c9919061253e565b634e487b7160e01b5f52604160045260245ffd5b604051602081016001600160401b0381118282101715611631576116316115fb565b60405290565b604080519081016001600160401b0381118282101715611631576116316115fb565b60405161024081016001600160401b0381118282101715611631576116316115fb565b604051601f8201601f191681016001600160401b03811182821017156116a4576116a46115fb565b604052919050565b80356001600160401b03811681146116c2575f80fd5b919050565b803563ffffffff811681146116c2575f80fd5b803562ffffff811681146116c2575f80fd5b5f606082840312156116fc575f80fd5b604051606081018181106001600160401b038211171561171e5761171e6115fb565b60405261172a836116ac565b8152611738602084016116c7565b6020820152611749604084016116da565b60408201529392505050565b6001600160a01b038116811461084c575f80fd5b80356116c281611755565b5f805f60608486031215611786575f80fd5b833561179181611755565b925060208401356117a181611755565b929592945050506040919091013590565b5f602082840312156117c2575f80fd5b8135610b5a81611755565b803580151581146116c2575f80fd5b5f805f606084860312156117ee575f80fd5b6117f7846116ac565b92506020840135915061180c604085016117cd565b90509250925092565b5f82601f830112611824575f80fd5b81356001600160401b0381111561183d5761183d6115fb565b611850601f8201601f191660200161167c565b818152846020838601011115611864575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215611891575f80fd5b823561189c81611755565b915060208301356001600160401b038111156118b6575f80fd5b6118c285828601611815565b9150509250929050565b5f80602083850312156118dd575f80fd5b82356001600160401b03808211156118f3575f80fd5b818501915085601f830112611906575f80fd5b813581811115611914575f80fd5b8660208260051b8501011115611928575f80fd5b60209290920196919550909350505050565b5f5b8381101561195457818101518382015260200161193c565b50505f910152565b5f815180845261197381602086016020860161193a565b601f01601f19169290920160200192915050565b8051602080845281518482018190525f926040919083019082870190600581901b88018401865b82811015611a2957898203603f19018452845180516001600160a01b031683528701518783018790528051878401819052908801905f9060608501905b80831015611a14578351805183528b01518b830152928a019260019290920191908901906119eb565b509689019695890195935050506001016119ae565b5098975050505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015611ba757888303603f1901855281518051845287810151888501528681015187850152606080820151908501526080808201519085015260a0808201519085015260c0808201519085015260e0808201516001600160a01b031690850152610100808201516001600160401b03908116918601919091526101208083015163ffffffff90811691870191909152610140808401519091169086015261016080830151909116908501526101808082015162ffffff908116918601919091526101a080830151909116908501526101c0808201511515908501526101e0808201516102408287018190529190611b588388018261195c565b925050506102008083015186830382880152611b74838261195c565b925050506102208083015192508582038187015250611b938183611987565b968901969450505090860190600101611a5d565b509098975050505050505050565b5f8060408385031215611bc6575f80fd5b82359150611bd6602084016117cd565b90509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f823561023e19833603018112611ca0575f80fd5b9190910192915050565b5f6001600160401b03821115611cc257611cc26115fb565b5060051b60200190565b5f60208284031215611cdc575f80fd5b611ce461160f565b90506001600160401b038083351115611cfb575f80fd5b8235830184601f820112611d0d575f80fd5b611d1f611d1a8235611caa565b61167c565b81358082526020808301929160051b84010187811115611d3d575f80fd5b602084015b81811015611e4a578581351115611d57575f80fd5b803585016040818b03601f19011215611d6e575f80fd5b611d76611637565b611d836020830135611755565b602082013581528760408301351115611d9a575f80fd5b6040820135820191508a603f830112611db1575f80fd5b6020820135611dc2611d1a82611caa565b81815260069190911b83016040019060208101908d831115611de2575f80fd5b6040850194505b82851015611e2b576040858f031215611e00575f80fd5b611e08611637565b853581526020860135602082015280835250602082019150604085019450611de9565b8060208501525050508086525050602084019350602081019050611d42565b505084525091949350505050565b5f611e65611d1a84611caa565b80848252602080830192508560051b850136811115611e82575f80fd5b855b8181101561200c5780356001600160401b0380821115611ea2575f80fd5b81890191506102408236031215611eb7575f80fd5b611ebf611659565b82358152858301358682015260408084013590820152606080840135908201526080808401359082015260a0808401359082015260c0808401359082015260e0611f0a818501611769565b90820152610100611f1c8482016116ac565b90820152610120611f2e8482016116c7565b90820152610140611f408482016116c7565b90820152610160611f528482016116ac565b90820152610180611f648482016116da565b908201526101a0611f768482016116da565b908201526101c0611f888482016117cd565b908201526101e08381013583811115611f9f575f80fd5b611fab36828701611815565b8284015250506102008084013583811115611fc4575f80fd5b611fd036828701611815565b8284015250506102208084013583811115611fe9575f80fd5b611ff536828701611ccc565b918301919091525087525050938201938201611e84565b50919695505050505050565b5f60208284031215612028575f80fd5b5051919050565b5f6020828403121561203f575f80fd5b8151610b5a81611755565b5f8235601e19833603018112611ca0575f80fd5b5f808335601e19843603018112612073575f80fd5b8301803591506001600160401b0382111561208c575f80fd5b6020019150600581901b36038213156120a3575f80fd5b9250929050565b5f8235603e19833603018112611ca0575f80fd5b5f808335601e198436030181126120d3575f80fd5b8301803591506001600160401b038211156120ec575f80fd5b6020019150600681901b36038213156120a3575f80fd5b8183525f60208085019450825f5b858110156121375781358752828201358388015260409687019690910190600101612111565b509495945050505050565b602081525f61085b602083018486612103565b5f60208284031215612165575f80fd5b610b5a826116ac565b5f808335601e19843603018112612183575f80fd5b83016020810192503590506001600160401b038111156121a1575f80fd5b8036038213156120a3575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8235601e198336030181126121eb575f80fd5b90910192915050565b5f60208084018335601e1985360301811261220d575f80fd5b840180358382016001600160401b0380831115612228575f80fd5b8260051b80360383131561223a575f80fd5b868a529483905260409489018501858a015f36879003605e19015b868210156122f2578c8403603f190183528535818112612273575f80fd5b88018a81013561228281611755565b6001600160a01b03168552808a013536829003603e190181126122a3575f80fd5b01898101908b0135868111156122b7575f80fd5b8060061b36038213156122c8575f80fd5b8a8c8701526122da8b87018284612103565b978c0197955050509189019160019190910190612255565b50919b9a5050505050505050505050565b6020815281356020820152602082013560408201526040820135606082015260608201356080820152608082013560a082015260a082013560c082015260c082013560e08201525f61235760e08401611769565b61010061236e818501836001600160a01b03169052565b6123798186016116ac565b915050610120612393818501836001600160401b03169052565b61239e8186016116c7565b9150506101406123b58185018363ffffffff169052565b6123c08186016116c7565b9150506101606123d78185018363ffffffff169052565b6123e28186016116ac565b9150506101806123fc818501836001600160401b03169052565b6124078186016116da565b9150506101a061241d8185018362ffffff169052565b6124288186016116da565b9150506101c061243e8185018362ffffff169052565b6124498186016117cd565b9150506101e061245c8185018315159052565b6124688186018661216e565b925090506102406102008181870152612486610260870185856121af565b93506124948188018861216e565b93509050601f196102208188870301818901526124b28686856121af565b95506124c0818a018a6121d7565b9450508087860301838801525050506124d982826121f4565b95945050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f8251611ca081846020870161193a565b602081525f610b5a602083018461195c56fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201fe472e8885cd4692d62ced21917ba755e872baf81e49732b5fb3c28ab56625264736f6c63430008180033","sourceMap":"435:7823:4:-:0;;;1088:4:95;1045:48;;435:7823:4;;;;;;;;;-1:-1:-1;1488:22:20;:20;:22::i;:::-;2712::21;:20;:22::i;:::-;435:7823:4;;5939:280:60;6007:13;;;;;;;6006:14;5998:66;;;;-1:-1:-1;;;5998:66:60;;216:2:156;5998:66:60;;;198:21:156;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:156;;;338:37;392:19;;5998:66:60;;;;;;;;6078:12;;6094:15;6078:12;;;:31;6074:139;;6125:12;:30;;-1:-1:-1;;6125:30:60;6140:15;6125:30;;;;;;6174:28;;564:36:156;;;6174:28:60;;552:2:156;537:18;6174:28:60;;;;;;;6074:139;5939:280::o;422:184:156:-;435:7823:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405260043610610147575f3560e01c8063715018a6116100b3578063a86f9d9e1161006d578063a86f9d9e1461034a578063c19d93fb14610369578063c3f909d4146103fb578063e07baba614610445578063e30c397814610482578063f2fde38b1461049f575f80fd5b8063715018a6146102c757806379ba5097146102db57806381e3925f146102ef5780638456cb59146103055780638abf6077146103195780638da5cb5b1461032d575f80fd5b80633f4ba83a116101045780633f4ba83a146102295780634f1ef2861461023d57806352d1902d146102505780635c975abb1461027257806365cfd675146102925780636b5ad7e0146102b2575f80fd5b806310f3ab1b1461014b5780633075db561461017f578063347258aa146101935780633659cfe6146101b45780633ab76e9f146101d35780633eb6b8cf1461020a575b5f80fd5b348015610156575f80fd5b5061016a6101653660046116ec565b6104be565b60405190151581526020015b60405180910390f35b34801561018a575f80fd5b5061016a61051f565b34801561019e575f80fd5b506101b26101ad366004611774565b610533565b005b3480156101bf575f80fd5b506101b26101ce3660046117b2565b610788565b3480156101de575f80fd5b506097546101f2906001600160a01b031681565b6040516001600160a01b039091168152602001610176565b348015610215575f80fd5b506101f26102243660046117dc565b61084f565b348015610234575f80fd5b506101b2610863565b6101b261024b366004611880565b610877565b34801561025b575f80fd5b50610264610930565b604051908152602001610176565b34801561027d575f80fd5b5061016a60c954610100900460ff1660021490565b6102a56102a03660046118cc565b6109e1565b6040516101769190611a36565b3480156102bd575f80fd5b5061026461708081565b3480156102d2575f80fd5b506101b2610aa5565b3480156102e6575f80fd5b506101b2610ab6565b3480156102fa575f80fd5b506102646202000081565b348015610310575f80fd5b506101b2610b2d565b348015610324575f80fd5b506101f2610b40565b348015610338575f80fd5b506033546001600160a01b03166101f2565b348015610355575f80fd5b506101f2610364366004611bb5565b610b4e565b348015610374575f80fd5b5060fd5460fe546103b9916001600160401b0380821692600160401b8304821692600160801b8104831692600160c01b90910481169160ff8116916101009091041686565b604080516001600160401b03978816815295871660208701529386169385019390935290841660608401521515608083015290911660a082015260c001610176565b348015610406575f80fd5b5061040f610b61565b6040805182516001600160401b0316815260208084015163ffffffff16908201529181015162ffffff1690820152606001610176565b348015610450575f80fd5b5060c95461046a906201000090046001600160401b031681565b6040516001600160401b039091168152602001610176565b34801561048d575f80fd5b506065546001600160a01b03166101f2565b3480156104aa575f80fd5b506101b26104b93660046117b2565b610ba5565b5f6001825f01516001600160401b03161115806104e35750602082015163ffffffff16155b806104f55750604082015162ffffff16155b8061050b575062020000826040015162ffffff16115b1561051757505f919050565b506001919050565b5f600261052a610c16565b60ff1614905090565b5f54610100900460ff161580801561055157505f54600160ff909116105b8061056a5750303b15801561056a57505f5460ff166001145b6105d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156105f3575f805461ff0019166101001790555b6105fd8484610c55565b5f610606610b61565b9050610611816104be565b61064e5760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420636f6e66696760901b60448201526064016105c9565b60fd805467ffffffffffffffff60801b19426001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff19909316439190911617821716600160801b179091555f80805260fb6020527fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d89758581557fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d897780546fffffffffffffffff000000000000000019169093179092556040517f68b82650828a9621868d09dc161400acbe189fa002e3fb7cf9dea5c2c6f928ee906107339087815260200190565b60405180910390a250508015610782575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036107d05760405162461bcd60e51b81526004016105c990611bdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610802610c94565b6001600160a01b0316146108285760405162461bcd60e51b81526004016105c990611c2b565b61083181610caf565b604080515f8082526020820190925261084c91839190610cb7565b50565b5f61085b848484610e21565b949350505050565b61086b610f12565b610875335f610fa2565b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108bf5760405162461bcd60e51b81526004016105c990611bdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108f1610c94565b6001600160a01b0316146109175760405162461bcd60e51b81526004016105c990611c2b565b61092082610caf565b61092c82826001610cb7565b5050565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109cf5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016105c9565b505f8051602061255183398151915290565b606060026109ed610c16565b60ff1603610a0e5760405163dfc60d8560e01b815260040160405180910390fd5b610a186002610faa565b610a2c60c954610100900460ff1660021490565b15610a4a5760405163bae6e2a960e01b815260040160405180910390fd5b5f5b82811015610a8857610a80848483818110610a6957610a69611c77565b9050602002810190610a7b9190611c8b565b610ff2565b600101610a4c565b50610a938284611e58565b9050610a9f6001610faa565b92915050565b610aad61115f565b6108755f6111b9565b60655433906001600160a01b03168114610b245760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016105c9565b61084c816111b9565b610b356111d2565b610875336001610fa2565b5f610b49610c94565b905090565b5f610b5a468484610e21565b9392505050565b604080516060810182525f8082526020820181905291810191909152506040805160608101825262028c60815262e4e1c060208201526201d4c09181019190915290565b610bad61115f565b606580546001600160a01b0383166001600160a01b03199091168117909155610bde6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f610c2046611243565b15610c4b57507fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5c90565b5060c95460ff1690565b806001600160a01b038116610c7d5760405163538ba4f960e01b815260040160405180910390fd5b610c8683611270565b610c8f826112ce565b505050565b5f80516020612551833981519152546001600160a01b031690565b61084c61115f565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610cea57610c8f8361133e565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610d44575060408051601f3d908101601f19168201909252610d4191810190612018565b60015b610da75760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016105c9565b5f805160206125518339815191528114610e155760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016105c9565b50610c8f8383836113d9565b6097545f906001600160a01b031680610e4d57604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0386166004820152602481018590526001600160a01b038216906328f713cc90604401602060405180830381865afa158015610e9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ec3919061202f565b915082158015610eda57506001600160a01b038216155b15610f0a57604051632b0d65db60e01b81526001600160401b0386166004820152602481018590526044016105c9565b509392505050565b610f2660c954610100900460ff1660021490565b610f435760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b61092c61115f565b610fb346611243565b15610fde57807fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5d50565b60c9805460ff831660ff1990911617905550565b5f5b61100261022083018361204a565b61100c908061205e565b90508110156111095761102361022083018361204a565b61102d908061205e565b8281811061103d5761103d611c77565b905060200281019061104f91906120aa565b61105d9060208101906117b2565b6001600160a01b031663307c30dd61107961022085018561204a565b611083908061205e565b8481811061109357611093611c77565b90506020028101906110a591906120aa565b6110b39060208101906120be565b6040518363ffffffff1660e01b81526004016110d0929190612142565b5f604051808303815f87803b1580156110e7575f80fd5b505af11580156110f9573d5f803e3d5ffd5b505060019092019150610ff49050565b5061111c61012082016101008301612155565b6001600160401b03167fbfbd11d93a0da0bb42e73cc53fbaab5714fa7d372abcf795303cfe3a57722498826040516111549190612303565b60405180910390a250565b6033546001600160a01b031633146108755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c9565b606580546001600160a01b031916905561084c816113fd565b6111e660c954610100900460ff1660021490565b156112045760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610f98565b5f6001821480611254575061426882145b80611261575062aa36a782145b80610a9f5750610a9f8261144e565b5f54610100900460ff166112965760405162461bcd60e51b81526004016105c9906124e2565b61129e611465565b6112bc6001600160a01b038216156112b657816111b9565b336111b9565b5060c9805461ff001916610100179055565b5f54610100900460ff166112f45760405162461bcd60e51b81526004016105c9906124e2565b6001600160401b0346111561131c5760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381163b6113ab5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016105c9565b5f8051602061255183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6113e28361148b565b5f825111806113ee5750805b15610c8f5761078283836114ca565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f617e2c8210158015610a9f575050617e90101590565b5f54610100900460ff166108755760405162461bcd60e51b81526004016105c9906124e2565b6114948161133e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610b5a83836040518060600160405280602781526020016125716027913960605f80856001600160a01b031685604051611506919061252d565b5f60405180830381855af49150503d805f811461153e576040519150601f19603f3d011682016040523d82523d5f602084013e611543565b606091505b50915091506115548683838761155e565b9695505050505050565b606083156115cc5782515f036115c5576001600160a01b0385163b6115c55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105c9565b508161085b565b61085b83838151156115e15781518083602001fd5b8060405162461bcd60e51b81526004016105c9919061253e565b634e487b7160e01b5f52604160045260245ffd5b604051602081016001600160401b0381118282101715611631576116316115fb565b60405290565b604080519081016001600160401b0381118282101715611631576116316115fb565b60405161024081016001600160401b0381118282101715611631576116316115fb565b604051601f8201601f191681016001600160401b03811182821017156116a4576116a46115fb565b604052919050565b80356001600160401b03811681146116c2575f80fd5b919050565b803563ffffffff811681146116c2575f80fd5b803562ffffff811681146116c2575f80fd5b5f606082840312156116fc575f80fd5b604051606081018181106001600160401b038211171561171e5761171e6115fb565b60405261172a836116ac565b8152611738602084016116c7565b6020820152611749604084016116da565b60408201529392505050565b6001600160a01b038116811461084c575f80fd5b80356116c281611755565b5f805f60608486031215611786575f80fd5b833561179181611755565b925060208401356117a181611755565b929592945050506040919091013590565b5f602082840312156117c2575f80fd5b8135610b5a81611755565b803580151581146116c2575f80fd5b5f805f606084860312156117ee575f80fd5b6117f7846116ac565b92506020840135915061180c604085016117cd565b90509250925092565b5f82601f830112611824575f80fd5b81356001600160401b0381111561183d5761183d6115fb565b611850601f8201601f191660200161167c565b818152846020838601011115611864575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215611891575f80fd5b823561189c81611755565b915060208301356001600160401b038111156118b6575f80fd5b6118c285828601611815565b9150509250929050565b5f80602083850312156118dd575f80fd5b82356001600160401b03808211156118f3575f80fd5b818501915085601f830112611906575f80fd5b813581811115611914575f80fd5b8660208260051b8501011115611928575f80fd5b60209290920196919550909350505050565b5f5b8381101561195457818101518382015260200161193c565b50505f910152565b5f815180845261197381602086016020860161193a565b601f01601f19169290920160200192915050565b8051602080845281518482018190525f926040919083019082870190600581901b88018401865b82811015611a2957898203603f19018452845180516001600160a01b031683528701518783018790528051878401819052908801905f9060608501905b80831015611a14578351805183528b01518b830152928a019260019290920191908901906119eb565b509689019695890195935050506001016119ae565b5098975050505050505050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015611ba757888303603f1901855281518051845287810151888501528681015187850152606080820151908501526080808201519085015260a0808201519085015260c0808201519085015260e0808201516001600160a01b031690850152610100808201516001600160401b03908116918601919091526101208083015163ffffffff90811691870191909152610140808401519091169086015261016080830151909116908501526101808082015162ffffff908116918601919091526101a080830151909116908501526101c0808201511515908501526101e0808201516102408287018190529190611b588388018261195c565b925050506102008083015186830382880152611b74838261195c565b925050506102208083015192508582038187015250611b938183611987565b968901969450505090860190600101611a5d565b509098975050505050505050565b5f8060408385031215611bc6575f80fd5b82359150611bd6602084016117cd565b90509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f823561023e19833603018112611ca0575f80fd5b9190910192915050565b5f6001600160401b03821115611cc257611cc26115fb565b5060051b60200190565b5f60208284031215611cdc575f80fd5b611ce461160f565b90506001600160401b038083351115611cfb575f80fd5b8235830184601f820112611d0d575f80fd5b611d1f611d1a8235611caa565b61167c565b81358082526020808301929160051b84010187811115611d3d575f80fd5b602084015b81811015611e4a578581351115611d57575f80fd5b803585016040818b03601f19011215611d6e575f80fd5b611d76611637565b611d836020830135611755565b602082013581528760408301351115611d9a575f80fd5b6040820135820191508a603f830112611db1575f80fd5b6020820135611dc2611d1a82611caa565b81815260069190911b83016040019060208101908d831115611de2575f80fd5b6040850194505b82851015611e2b576040858f031215611e00575f80fd5b611e08611637565b853581526020860135602082015280835250602082019150604085019450611de9565b8060208501525050508086525050602084019350602081019050611d42565b505084525091949350505050565b5f611e65611d1a84611caa565b80848252602080830192508560051b850136811115611e82575f80fd5b855b8181101561200c5780356001600160401b0380821115611ea2575f80fd5b81890191506102408236031215611eb7575f80fd5b611ebf611659565b82358152858301358682015260408084013590820152606080840135908201526080808401359082015260a0808401359082015260c0808401359082015260e0611f0a818501611769565b90820152610100611f1c8482016116ac565b90820152610120611f2e8482016116c7565b90820152610140611f408482016116c7565b90820152610160611f528482016116ac565b90820152610180611f648482016116da565b908201526101a0611f768482016116da565b908201526101c0611f888482016117cd565b908201526101e08381013583811115611f9f575f80fd5b611fab36828701611815565b8284015250506102008084013583811115611fc4575f80fd5b611fd036828701611815565b8284015250506102208084013583811115611fe9575f80fd5b611ff536828701611ccc565b918301919091525087525050938201938201611e84565b50919695505050505050565b5f60208284031215612028575f80fd5b5051919050565b5f6020828403121561203f575f80fd5b8151610b5a81611755565b5f8235601e19833603018112611ca0575f80fd5b5f808335601e19843603018112612073575f80fd5b8301803591506001600160401b0382111561208c575f80fd5b6020019150600581901b36038213156120a3575f80fd5b9250929050565b5f8235603e19833603018112611ca0575f80fd5b5f808335601e198436030181126120d3575f80fd5b8301803591506001600160401b038211156120ec575f80fd5b6020019150600681901b36038213156120a3575f80fd5b8183525f60208085019450825f5b858110156121375781358752828201358388015260409687019690910190600101612111565b509495945050505050565b602081525f61085b602083018486612103565b5f60208284031215612165575f80fd5b610b5a826116ac565b5f808335601e19843603018112612183575f80fd5b83016020810192503590506001600160401b038111156121a1575f80fd5b8036038213156120a3575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f8235601e198336030181126121eb575f80fd5b90910192915050565b5f60208084018335601e1985360301811261220d575f80fd5b840180358382016001600160401b0380831115612228575f80fd5b8260051b80360383131561223a575f80fd5b868a529483905260409489018501858a015f36879003605e19015b868210156122f2578c8403603f190183528535818112612273575f80fd5b88018a81013561228281611755565b6001600160a01b03168552808a013536829003603e190181126122a3575f80fd5b01898101908b0135868111156122b7575f80fd5b8060061b36038213156122c8575f80fd5b8a8c8701526122da8b87018284612103565b978c0197955050509189019160019190910190612255565b50919b9a5050505050505050505050565b6020815281356020820152602082013560408201526040820135606082015260608201356080820152608082013560a082015260a082013560c082015260c082013560e08201525f61235760e08401611769565b61010061236e818501836001600160a01b03169052565b6123798186016116ac565b915050610120612393818501836001600160401b03169052565b61239e8186016116c7565b9150506101406123b58185018363ffffffff169052565b6123c08186016116c7565b9150506101606123d78185018363ffffffff169052565b6123e28186016116ac565b9150506101806123fc818501836001600160401b03169052565b6124078186016116da565b9150506101a061241d8185018362ffffff169052565b6124288186016116da565b9150506101c061243e8185018362ffffff169052565b6124498186016117cd565b9150506101e061245c8185018315159052565b6124688186018661216e565b925090506102406102008181870152612486610260870185856121af565b93506124948188018861216e565b93509050601f196102208188870301818901526124b28686856121af565b95506124c0818a018a6121d7565b9450508087860301838801525050506124d982826121f4565b95945050505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f8251611ca081846020870161193a565b602081525f610b5a602083018461195c56fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201fe472e8885cd4692d62ced21917ba755e872baf81e49732b5fb3c28ab56625264736f6c63430008180033","sourceMap":"435:7823:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7369:348;;;;;;;;;;-1:-1:-1;7369:348:4;;;;;:::i;:::-;;:::i;:::-;;;2565:14:156;;2558:22;2540:41;;2528:2;2513:18;7369:348:4;;;;;;;;3558:104:21;;;;;;;;;;;;;:::i;1025:743:4:-;;;;;;;;;;-1:-1:-1;1025:743:4;;;;;:::i;:::-;;:::i;:::-;;3143:195:95;;;;;;;;;;-1:-1:-1;3143:195:95;;;;;:::i;:::-;;:::i;453:29:20:-;;;;;;;;;;-1:-1:-1;453:29:20;;;;-1:-1:-1;;;;;453:29:20;;;;;;-1:-1:-1;;;;;3853:32:156;;;3835:51;;3823:2;3808:18;453:29:20;3689:203:156;1844:253:20;;;;;;;;;;-1:-1:-1;1844:253:20;;;;;:::i;:::-;;:::i;3031:207:21:-;;;;;;;;;;;;;:::i;3657:220:95:-;;;;;;:::i;:::-;;:::i;2762:131::-;;;;;;;;;;;;;:::i;:::-;;;5752:25:156;;;5740:2;5725:18;2762:131:95;5606:177:156;3466:86:21;;;;;;;;;;;;3528:8;;;;;:17;:8;521:1;3528:17;;3466:86;1822:510:4;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;544:61::-;;;;;;;;;;;;598:7;544:61;;2085:101:55;;;;;;;;;;;;;:::i;2031:212:54:-;;;;;;;;;;;;;:::i;726:54:4:-;;;;;;;;;;;;771:9;726:54;;2784:202:21;;;;;;;;;;;;;:::i;3244:90::-;;;;;;;;;;;;;:::i;1462:85:55:-;;;;;;;;;;-1:-1:-1;1534:6:55;;-1:-1:-1;;;;;1534:6:55;1462:85;;1560:241:20;;;;;;;;;;-1:-1:-1;1560:241:20;;;;;:::i;:::-;;:::i;787:28:4:-;;;;;;;;;;-1:-1:-1;787:28:4;;;;;;-1:-1:-1;;;;;787:28:4;;;;-1:-1:-1;;;787:28:4;;;;;-1:-1:-1;;;787:28:4;;;;;-1:-1:-1;;;787:28:4;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12685:15:156;;;12667:34;;12737:15;;;12732:2;12717:18;;12710:43;12789:15;;;12769:18;;;12762:43;;;;12841:15;;;12836:2;12821:18;;12814:43;12901:14;12894:22;12888:3;12873:19;;12866:51;12954:15;;;12948:3;12933:19;;12926:44;12617:3;12602:19;787:28:4;12359:617:156;6850:513:4;;;;;;;;;;;;;:::i;:::-;;;;13195:13:156;;-1:-1:-1;;;;;13191:38:156;13173:57;;13290:4;13278:17;;;13272:24;13298:10;13268:41;13246:20;;;13239:71;13358:17;;;13352:24;13378:8;13348:39;13326:20;;;13319:69;13161:2;13146:18;6850:513:4;12981:413:156;1105:28:21;;;;;;;;;;-1:-1:-1;1105:28:21;;;;;;;-1:-1:-1;;;;;1105:28:21;;;;;;-1:-1:-1;;;;;13561:31:156;;;13543:50;;13531:2;13516:18;1105:28:21;13399:200:156;1144:99:54;;;;;;;;;;-1:-1:-1;1223:13:54;;-1:-1:-1;;;;;1223:13:54;1144:99;;1436:178;;;;;;;;;;-1:-1:-1;1436:178:54;;;;;:::i;:::-;;:::i;7369:348:4:-;7445:4;7496:1;7478:6;:14;;;-1:-1:-1;;;;;7478:19:4;;;:70;;;-1:-1:-1;7520:23:4;;;;:28;;;7478:70;:105;;;-1:-1:-1;7552:26:4;;;;:31;;;7478:105;:164;;;;7632:10;7603:6;:26;;;:39;;;7478:164;7461:227;;;-1:-1:-1;7683:5:4;;7369:348;-1:-1:-1;7369:348:4:o;7461:227::-;-1:-1:-1;7706:4:4;;7369:348;-1:-1:-1;7369:348:4:o;3558:104:21:-;3605:4;521:1;3628:18;:16;:18::i;:::-;:27;;;3621:34;;3558:104;:::o;1025:743:4:-;3279:19:60;3302:13;;;;;;3301:14;;3347:34;;;;-1:-1:-1;3365:12:60;;3380:1;3365:12;;;;:16;3347:34;3346:108;;;-1:-1:-1;3426:4:60;1713:19:76;:23;;;3387:66:60;;-1:-1:-1;3436:12:60;;;;;:17;3387:66;3325:201;;;;-1:-1:-1;;;3325:201:60;;13806:2:156;3325:201:60;;;13788:21:156;13845:2;13825:18;;;13818:30;13884:34;13864:18;;;13857:62;-1:-1:-1;;;13935:18:156;;;13928:44;13989:19;;3325:201:60;;;;;;;;;3536:12;:16;;-1:-1:-1;;3536:16:60;3551:1;3536:16;;;3562:65;;;;3596:13;:20;;-1:-1:-1;;3596:20:60;;;;;3562:65;1188:41:4::1;1205:6;1213:15;1188:16;:41::i;:::-;1240:30;1273:11;:9;:11::i;:::-;1240:44;;1302:21;1316:6;1302:13;:21::i;:::-;1294:48;;;::::0;-1:-1:-1;;;1294:48:4;;14221:2:156;1294:48:4::1;::::0;::::1;14203:21:156::0;14260:2;14240:18;;;14233:30;-1:-1:-1;;;14279:18:156;;;14272:44;14333:18;;1294:48:4::1;14019:338:156::0;1294:48:4::1;1375:19:::0;:42;;-1:-1:-1;;;;1459:15:4::1;-1:-1:-1::0;;;;;1427:48:4;;::::1;-1:-1:-1::0;;;1427:48:4::1;-1:-1:-1::0;;1427:48:4;;;1404:12:::1;1375:42:::0;;;::::1;1427:48:::0;;::::1;1485:19;-1:-1:-1::0;;;1485:19:4::1;::::0;;;1375::::1;1579:15:::0;;;1375:5:::1;1579:15;::::0;;1604:33;;;1647:13;:39;;-1:-1:-1;;1647:39:4::1;::::0;;::::1;::::0;;;1579:15;1702:59;::::1;::::0;::::1;::::0;1620:17;5752:25:156;;5740:2;5725:18;;5606:177;1702:59:4::1;;;;;;;;1178:590;;3651:14:60::0;3647:99;;;3697:5;3681:21;;-1:-1:-1;;3681:21:60;;;3721:14;;-1:-1:-1;14514:36:156;;3721:14:60;;14502:2:156;14487:18;3721:14:60;;;;;;;3647:99;3269:483;1025:743:4;;;:::o;3143:195:95:-;-1:-1:-1;;;;;1654:6:95;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:95;;;;;;;:::i;:::-;1751:6;-1:-1:-1;;;;;1727:30:95;:20;:18;:20::i;:::-;-1:-1:-1;;;;;1727:30:95;;1719:87;;;;-1:-1:-1;;;1719:87:95;;;;;;;:::i;:::-;3224:36:::1;3242:17;3224;:36::i;:::-;3311:12;::::0;;3321:1:::1;3311:12:::0;;;::::1;::::0;::::1;::::0;;;3270:61:::1;::::0;3292:17;;3311:12;3270:21:::1;:61::i;:::-;3143:195:::0;:::o;1844:253:20:-;2008:15;2046:44;2055:8;2065:5;2072:17;2046:8;:44::i;:::-;2039:51;1844:253;-1:-1:-1;;;;1844:253:20:o;3031:207:21:-;3075:10;:8;:10::i;:::-;3197:34;3213:10;3225:5;3197:15;:34::i;:::-;3031:207::o;3657:220:95:-;-1:-1:-1;;;;;1654:6:95;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:95;;;;;;;:::i;:::-;1751:6;-1:-1:-1;;;;;1727:30:95;:20;:18;:20::i;:::-;-1:-1:-1;;;;;1727:30:95;;1719:87;;;;-1:-1:-1;;;1719:87:95;;;;;;;:::i;:::-;3772:36:::1;3790:17;3772;:36::i;:::-;3818:52;3840:17;3859:4;3865;3818:21;:52::i;:::-;3657:220:::0;;:::o;2762:131::-;2840:7;2080:4;-1:-1:-1;;;;;2089:6:95;2072:23;;2064:92;;;;-1:-1:-1;;;2064:92:95;;15589:2:156;2064:92:95;;;15571:21:156;15628:2;15608:18;;;15601:30;15667:34;15647:18;;;15640:62;15738:26;15718:18;;;15711:54;15782:19;;2064:92:95;15387:420:156;2064:92:95;-1:-1:-1;;;;;;;;;;;;2762:131:95;:::o;1822:510:4:-;1992:40;521:1:21;2064:18;:16;:18::i;:::-;:27;;;2060:56;;2100:16;;-1:-1:-1;;;2100:16:21;;;;;;;;;;;2060:56;2126:24;521:1;2126:17;:24::i;:::-;2348:8:::1;3528::::0;;;;;:17;:8;521:1;3528:17;;3466:86;2348:8:::1;2344:43;;;2365:22;;-1:-1:-1::0;;;2365:22:21::1;;;;;;;;;;;2344:43;2053:9:4::2;2048:253;2068:15:::0;;::::2;2048:253;;;2104:22;2118:4;;2123:1;2118:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2104:13;:22::i;:::-;2085:3;;2048:253;;;-1:-1:-1::0;2311:14:4::2;2321:4:::0;;2311:14:::2;:::i;:::-;;;2171:25:21::0;482:1;2171:17;:25::i;:::-;1822:510:4;;;;:::o;2085:101:55:-;1355:13;:11;:13::i;:::-;2149:30:::1;2176:1;2149:18;:30::i;2031:212:54:-:0;1223:13;;965:10:77;;-1:-1:-1;;;;;1223:13:54;2130:24;;2122:78;;;;-1:-1:-1;;;2122:78:54;;22017:2:156;2122:78:54;;;21999:21:156;22056:2;22036:18;;;22029:30;22095:34;22075:18;;;22068:62;-1:-1:-1;;;22146:18:156;;;22139:39;22195:19;;2122:78:54;21815:405:156;2122:78:54;2210:26;2229:6;2210:18;:26::i;2784:202:21:-;2826:8;:6;:8::i;:::-;2946:33;2962:10;2974:4;2946:15;:33::i;3244:90::-;3281:7;3307:20;:18;:20::i;:::-;3300:27;;3244:90;:::o;1560:241:20:-;1699:15;1737:57;1753:13;1769:5;1776:17;1737:8;:57::i;:::-;1730:64;1560:241;-1:-1:-1;;;1560:241:20:o;6850:513:4:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;6942:414:4;;;;;;;;6982:7;6942:414;;7120:10;6942:414;;;;7338:7;6942:414;;;;;;;;6850:513::o;1436:178:54:-;1355:13:55;:11;:13::i;:::-;1525::54::1;:24:::0;;-1:-1:-1;;;;;1525:24:54;::::1;-1:-1:-1::0;;;;;;1525:24:54;;::::1;::::0;::::1;::::0;;;1589:7:::1;1534:6:55::0;;-1:-1:-1;;;;;1534:6:55;;1462:85;1589:7:54::1;-1:-1:-1::0;;;;;1564:43:54::1;;;;;;;;;;;1436:178:::0;:::o;5115:288:21:-;5174:14;5204:43;5233:13;5204:28;:43::i;:::-;5200:197;;;-1:-1:-1;5308:13:21;5302:20;2762:131:95;:::o;5200:197:21:-;-1:-1:-1;5377:9:21;;;;5115:288;:::o;3884:237::-;4010:15;-1:-1:-1;;;;;2461:19:21;;2457:46;;2489:14;;-1:-1:-1;;;2489:14:21;;;;;;;;;;;2457:46;4041:24:::1;4058:6;4041:16;:24::i;:::-;4075:39;4098:15;4075:22;:39::i;:::-;3884:237:::0;;;:::o;1175:140:91:-;-1:-1:-1;;;;;;;;;;;1254:54:91;-1:-1:-1;;;;;1254:54:91;;1175:140::o;4619:75:21:-;1355:13:55;:11;:13::i;2494:922:91:-;689:66;2910:48;;;2906:504;;;2974:37;2993:17;2974:18;:37::i;2906:504::-;3064:17;-1:-1:-1;;;;;3046:50:91;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3046:52:91;;;;;;;;-1:-1:-1;;3046:52:91;;;;;;;;;;;;:::i;:::-;;;3042:291;;3262:56;;-1:-1:-1;;;3262:56:91;;22616:2:156;3262:56:91;;;22598:21:156;22655:2;22635:18;;;22628:30;22694:34;22674:18;;;22667:62;-1:-1:-1;;;22745:18:156;;;22738:44;22799:19;;3262:56:91;22414:410:156;3042:291:91;-1:-1:-1;;;;;;;;;;;3148:28:91;;3140:82;;;;-1:-1:-1;;;3140:82:91;;23031:2:156;3140:82:91;;;23013:21:156;23070:2;23050:18;;;23043:30;23109:34;23089:18;;;23082:62;-1:-1:-1;;;23160:18:156;;;23153:39;23209:19;;3140:82:91;22829:405:156;3140:82:91;3099:138;3346:53;3364:17;3383:4;3389:9;3346:17;:53::i;2864:524:20:-;3077:14;;3014:21;;-1:-1:-1;;;;;3077:14:20;;3101:68;;3143:26;;-1:-1:-1;;;3143:26:20;;;;;;;;;;;3101:68;3196:60;;-1:-1:-1;;;3196:60:20;;-1:-1:-1;;;;;23429:31:156;;3196:60:20;;;23411:50:156;23477:18;;;23470:34;;;-1:-1:-1;;;;;3196:43:20;;;;;23384:18:156;;3196:60:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3180:77;;3273:17;3272:18;:41;;;;-1:-1:-1;;;;;;3294:19:20;;;3272:41;3268:114;;;3336:35;;-1:-1:-1;;;3336:35:20;;-1:-1:-1;;;;;23429:31:156;;3336:35:20;;;23411:50:156;23477:18;;;23470:34;;;23384:18;;3336:35:20;23239:271:156;3268:114:20;3041:347;2864:524;;;;;:::o;4454:159:21:-;2246:8;3528;;;;;:17;:8;521:1;3528:17;;3466:86;2246:8;2241:44;;2263:22;;-1:-1:-1;;;2263:22:21;;;;;;;;;;;2241:44;4504:8:::1;:17:::0;;::::1;-1:-1:-1::0;;4531:40:21;;;;4555:15:::1;-1:-1:-1::0;;;;;4531:40:21::1;;::::0;;;;4586:20:::1;::::0;4595:10:::1;3835:51:156::0;;4586:20:21::1;::::0;3823:2:156;3808:18;4586:20:21::1;;;;;;;;4454:159::o:0;4700:70::-;1355:13:55;:11;:13::i;4807:272:21:-;4881:43;4910:13;4881:28;:43::i;:::-;4877:196;;;4989:8;4974:13;4967:31;3143:195:95;:::o;4877:196:21:-;5042:9;:20;;;;;-1:-1:-1;;5042:20:21;;;;;;4807:272;:::o;2456:3930:4:-;6114:6;6109:193;6130:18;;;;:6;:18;:::i;:::-;:27;;;;:::i;:::-;:34;;6126:1;:38;6109:193;;;6201:18;;;;:6;:18;:::i;:::-;:27;;;;:::i;:::-;6229:1;6201:30;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:35;;;;;;;:::i;:::-;-1:-1:-1;;;;;6185:68:4;;6254:18;;;;:6;:18;:::i;:::-;:27;;;;:::i;:::-;6282:1;6254:30;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:36;;;;;;;:::i;:::-;6185:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6166:3:4;;;;;-1:-1:-1;6109:193:4;;-1:-1:-1;6109:193:4;;-1:-1:-1;6342:20:4;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6317:62:4;;6370:6;6317:62;;;;;;:::i;:::-;;;;;;;;2456:3930;:::o;1620:130:55:-;1534:6;;-1:-1:-1;;;;;1534:6:55;965:10:77;1683:23:55;1675:68;;;;-1:-1:-1;;;1675:68:55;;32794:2:156;1675:68:55;;;32776:21:156;;;32813:18;;;32806:30;32872:34;32852:18;;;32845:62;32924:18;;1675:68:55;32592:356:156;1798:153:54;1887:13;1880:20;;-1:-1:-1;;;;;;1880:20:54;;;1910:34;1935:8;1910:24;:34::i;4341:107:21:-;2348:8;3528;;;;;:17;:8;521:1;3528:17;;3466:86;2348:8;2344:43;;;2365:22;;-1:-1:-1;;;2365:22:21;;;;;;;;;;;2344:43;4392:8:::1;:16:::0;;-1:-1:-1;;4392:16:21::1;::::0;::::1;::::0;;4423:18:::1;::::0;4430:10:::1;3835:51:156::0;;4423:18:21::1;::::0;3823:2:156;3808:18;4423::21::1;3689:203:156::0;2377:235:29;2445:4;140:1;2468:8;:30;:64;;;;353:6;2502:8;:30;2468:64;:110;;;;401:10;2548:8;:30;2468:110;:137;;;;2582:23;2596:8;2582:13;:23::i;4127:208:21:-;5374:13:60;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:60;;;;;;;:::i;:::-;4213:16:21::1;:14;:16::i;:::-;4239:62;-1:-1:-1::0;;;;;4258:20:21;::::1;::::0;:42:::1;;4294:6;4239:18;:62::i;4258:42::-;4281:10;4239:18;:62::i;:::-;-1:-1:-1::0;4311:8:21::1;:17:::0;;-1:-1:-1;;4311:17:21::1;;;::::0;;4127:208::o;2241:248:20:-;5374:13:60;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:60;;;;;;;:::i;:::-;-1:-1:-1;;;;;2346:13:20::1;:32;2342:99;;;2401:29;;-1:-1:-1::0;;;2401:29:20::1;;;;;;;;;;;2342:99;2450:14;:32:::0;;-1:-1:-1;;;;;;2450:32:20::1;-1:-1:-1::0;;;;;2450:32:20;;;::::1;::::0;;;::::1;::::0;;2241:248::o;1406:259:91:-;-1:-1:-1;;;;;1713:19:76;;;1479:95:91;;;;-1:-1:-1;;;1479:95:91;;33567:2:156;1479:95:91;;;33549:21:156;33606:2;33586:18;;;33579:30;33645:34;33625:18;;;33618:62;-1:-1:-1;;;33696:18:156;;;33689:43;33749:19;;1479:95:91;33365:409:156;1479:95:91;-1:-1:-1;;;;;;;;;;;1584:74:91;;-1:-1:-1;;;;;;1584:74:91;-1:-1:-1;;;;;1584:74:91;;;;;;;;;;1406:259::o;2057:265::-;2165:29;2176:17;2165:10;:29::i;:::-;2222:1;2208:4;:11;:15;:28;;;;2227:9;2208:28;2204:112;;;2252:53;2281:17;2300:4;2252:28;:53::i;2687:187:55:-;2779:6;;;-1:-1:-1;;;;;2795:17:55;;;-1:-1:-1;;;;;;2795:17:55;;;;;;;2827:40;;2779:6;;;2795:17;2779:6;;2827:40;;2760:16;;2827:40;2750:124;2687:187;:::o;2003:134:29:-;2067:4;2102:6;2090:8;:18;;:40;;;;-1:-1:-1;;2124:6:29;-1:-1:-1;2112:18:29;;2003:134::o;747:59:77:-;5374:13:60;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:60;;;;;;;:::i;1771:152:91:-;1837:37;1856:17;1837:18;:37::i;:::-;1889:27;;-1:-1:-1;;;;;1889:27:91;;;;;;;;1771:152;:::o;6674:198:109:-;6757:12;6788:77;6809:6;6817:4;6788:77;;;;;;;;;;;;;;;;;7199:12;7224;7238:23;7265:6;-1:-1:-1;;;;;7265:19:109;7285:4;7265:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7223:67;;;;7307:69;7334:6;7342:7;7351:10;7363:12;7307:26;:69::i;:::-;7300:76;7058:325;-1:-1:-1;;;;;;7058:325:109:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1713:19:76;;;8113:60:109;;;;-1:-1:-1;;;8113:60:109;;34273:2:156;8113:60:109;;;34255:21:156;34312:2;34292:18;;;34285:30;34351:31;34331:18;;;34324:59;34400:18;;8113:60:109;34071:353:156;8113:60:109;-1:-1:-1;8208:10:109;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;-1:-1:-1;;;9324:20:109;;;;;;;;:::i;14:127:156:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:253;218:2;212:9;260:4;248:17;;-1:-1:-1;;;;;280:34:156;;316:22;;;277:62;274:88;;;342:18;;:::i;:::-;378:2;371:22;146:253;:::o;404:257::-;476:4;470:11;;;508:17;;-1:-1:-1;;;;;540:34:156;;576:22;;;537:62;534:88;;;602:18;;:::i;666:255::-;738:2;732:9;780:6;768:19;;-1:-1:-1;;;;;802:34:156;;838:22;;;799:62;796:88;;;864:18;;:::i;926:275::-;997:2;991:9;1062:2;1043:13;;-1:-1:-1;;1039:27:156;1027:40;;-1:-1:-1;;;;;1082:34:156;;1118:22;;;1079:62;1076:88;;;1144:18;;:::i;:::-;1180:2;1173:22;926:275;;-1:-1:-1;926:275:156:o;1206:171::-;1273:20;;-1:-1:-1;;;;;1322:30:156;;1312:41;;1302:69;;1367:1;1364;1357:12;1302:69;1206:171;;;:::o;1382:163::-;1449:20;;1509:10;1498:22;;1488:33;;1478:61;;1535:1;1532;1525:12;1550:161;1617:20;;1677:8;1666:20;;1656:31;;1646:59;;1701:1;1698;1691:12;1716:583;1798:6;1851:2;1839:9;1830:7;1826:23;1822:32;1819:52;;;1867:1;1864;1857:12;1819:52;1900:2;1894:9;1942:2;1934:6;1930:15;2011:6;1999:10;1996:22;-1:-1:-1;;;;;1963:10:156;1960:34;1957:62;1954:88;;;2022:18;;:::i;:::-;2058:2;2051:22;2097:28;2115:9;2097:28;:::i;:::-;2089:6;2082:44;2159:37;2192:2;2181:9;2177:18;2159:37;:::i;:::-;2154:2;2146:6;2142:15;2135:62;2230:37;2263:2;2252:9;2248:18;2230:37;:::i;:::-;2225:2;2213:15;;2206:62;2217:6;1716:583;-1:-1:-1;;;1716:583:156:o;2592:131::-;-1:-1:-1;;;;;2667:31:156;;2657:42;;2647:70;;2713:1;2710;2703:12;2728:134;2796:20;;2825:31;2796:20;2825:31;:::i;2867:456::-;2944:6;2952;2960;3013:2;3001:9;2992:7;2988:23;2984:32;2981:52;;;3029:1;3026;3019:12;2981:52;3068:9;3055:23;3087:31;3112:5;3087:31;:::i;:::-;3137:5;-1:-1:-1;3194:2:156;3179:18;;3166:32;3207:33;3166:32;3207:33;:::i;:::-;2867:456;;3259:7;;-1:-1:-1;;;3313:2:156;3298:18;;;;3285:32;;2867:456::o;3328:247::-;3387:6;3440:2;3428:9;3419:7;3415:23;3411:32;3408:52;;;3456:1;3453;3446:12;3408:52;3495:9;3482:23;3514:31;3539:5;3514:31;:::i;3897:160::-;3962:20;;4018:13;;4011:21;4001:32;;3991:60;;4047:1;4044;4037:12;4062:320;4135:6;4143;4151;4204:2;4192:9;4183:7;4179:23;4175:32;4172:52;;;4220:1;4217;4210:12;4172:52;4243:28;4261:9;4243:28;:::i;:::-;4233:38;;4318:2;4307:9;4303:18;4290:32;4280:42;;4341:35;4372:2;4361:9;4357:18;4341:35;:::i;:::-;4331:45;;4062:320;;;;;:::o;4611:530::-;4653:5;4706:3;4699:4;4691:6;4687:17;4683:27;4673:55;;4724:1;4721;4714:12;4673:55;4760:6;4747:20;-1:-1:-1;;;;;4782:2:156;4779:26;4776:52;;;4808:18;;:::i;:::-;4852:55;4895:2;4876:13;;-1:-1:-1;;4872:27:156;4901:4;4868:38;4852:55;:::i;:::-;4932:2;4923:7;4916:19;4978:3;4971:4;4966:2;4958:6;4954:15;4950:26;4947:35;4944:55;;;4995:1;4992;4985:12;4944:55;5060:2;5053:4;5045:6;5041:17;5034:4;5025:7;5021:18;5008:55;5108:1;5083:16;;;5101:4;5079:27;5072:38;;;;5087:7;4611:530;-1:-1:-1;;;4611:530:156:o;5146:455::-;5223:6;5231;5284:2;5272:9;5263:7;5259:23;5255:32;5252:52;;;5300:1;5297;5290:12;5252:52;5339:9;5326:23;5358:31;5383:5;5358:31;:::i;:::-;5408:5;-1:-1:-1;5464:2:156;5449:18;;5436:32;-1:-1:-1;;;;;5480:30:156;;5477:50;;;5523:1;5520;5513:12;5477:50;5546:49;5587:7;5578:6;5567:9;5563:22;5546:49;:::i;:::-;5536:59;;;5146:455;;;;;:::o;5788:647::-;5906:6;5914;5967:2;5955:9;5946:7;5942:23;5938:32;5935:52;;;5983:1;5980;5973:12;5935:52;6023:9;6010:23;-1:-1:-1;;;;;6093:2:156;6085:6;6082:14;6079:34;;;6109:1;6106;6099:12;6079:34;6147:6;6136:9;6132:22;6122:32;;6192:7;6185:4;6181:2;6177:13;6173:27;6163:55;;6214:1;6211;6204:12;6163:55;6254:2;6241:16;6280:2;6272:6;6269:14;6266:34;;;6296:1;6293;6286:12;6266:34;6349:7;6344:2;6334:6;6331:1;6327:14;6323:2;6319:23;6315:32;6312:45;6309:65;;;6370:1;6367;6360:12;6309:65;6401:2;6393:11;;;;;6423:6;;-1:-1:-1;5788:647:156;;-1:-1:-1;;;;5788:647:156:o;6743:250::-;6828:1;6838:113;6852:6;6849:1;6846:13;6838:113;;;6928:11;;;6922:18;6909:11;;;6902:39;6874:2;6867:10;6838:113;;;-1:-1:-1;;6985:1:156;6967:16;;6960:27;6743:250::o;6998:270::-;7039:3;7077:5;7071:12;7104:6;7099:3;7092:19;7120:76;7189:6;7182:4;7177:3;7173:14;7166:4;7159:5;7155:16;7120:76;:::i;:::-;7250:2;7229:15;-1:-1:-1;;7225:29:156;7216:39;;;;7257:4;7212:50;;6998:270;-1:-1:-1;;6998:270:156:o;7273:1491::-;7419:12;;7353:4;7440:15;;;7504:19;;7378:12;;;7532:20;;;7325:3;;7571:2;;7682:21;;;;7591:12;;;;7643:1;7639:14;;;7630:24;;7626:33;;7325:3;7731:1005;7745:6;7742:1;7739:13;7731:1005;;;7812:16;;;-1:-1:-1;;7808:30:156;7794:45;;7862:13;;7949:9;;-1:-1:-1;;;;;7945:35:156;7930:51;;8022:11;;8016:18;8054:15;;;8047:27;;;8135:21;;7902:15;;;8169:24;;;8259:23;;;;8306:1;;8227:2;8215:15;;;8320:304;8336:8;8331:3;8328:17;8320:304;;;8409:15;;8455:9;;8441:24;;8511:11;;8505:18;8489:14;;;8482:42;8593:17;;;;8364:1;8355:11;;;;;8550:14;;;;8320:304;;;-1:-1:-1;8675:15:156;;;;8712:14;;;;8647:5;-1:-1:-1;;;7767:1:156;7760:9;7731:1005;;;-1:-1:-1;8752:6:156;7273:1491;-1:-1:-1;;;;;;;;7273:1491:156:o;8769:3150::-;8971:4;9000:2;9040;9029:9;9025:18;9070:2;9059:9;9052:21;9093:6;9128;9122:13;9159:6;9151;9144:22;9185:2;9175:12;;9218:2;9207:9;9203:18;9196:25;;9280:2;9270:6;9267:1;9263:14;9252:9;9248:30;9244:39;9318:2;9310:6;9306:15;9339:1;9349:2541;9363:6;9360:1;9357:13;9349:2541;;;9428:22;;;-1:-1:-1;;9424:36:156;9412:49;;9484:13;;9554:9;;9539:25;;9607:11;;;9601:18;9584:15;;;9577:43;9663:11;;;9657:18;9640:15;;;9633:43;9699:4;9746:11;;;9740:18;9723:15;;;9716:43;9782:4;9829:11;;;9823:18;9806:15;;;9799:43;9865:4;9912:11;;;9906:18;9889:15;;;9882:43;9948:4;9995:11;;;9989:18;9972:15;;;9965:43;10031:4;10074:11;;;10068:18;-1:-1:-1;;;;;3646:31:156;10132:15;;;3634:44;10172:6;10219:12;;;10213:19;-1:-1:-1;;;;;6505:30:156;;;10279:16;;;6493:43;;;;10320:6;10367:12;;;10361:19;6623:10;6612:22;;;10427:16;;;6600:35;;;;10468:6;10515:12;;;10509:19;6612:22;;;10575:16;;;6600:35;10616:6;10663:12;;;10657:19;6505:30;;;10723:16;;;6493:43;10764:6;10811:12;;;10805:19;6722:8;6711:20;;;10871:16;;;6699:33;;;;10912:6;10959:12;;;10953:19;6711:20;;;11019:16;;;6699:33;11060:6;11107:12;;;11101:19;2374:13;2367:21;11165:16;;;2355:34;11206:6;11253:12;;;11247:19;9520:6;11286:16;;;11279:28;;;9520:6;11206;11334:49;11367:15;;;11247:19;11334:49;:::i;:::-;11320:63;;;;11407:6;11462:3;11458:2;11454:12;11448:19;11517:6;11509;11505:19;11499:3;11491:6;11487:16;11480:45;11552:40;11585:6;11569:14;11552:40;:::i;:::-;11538:54;;;;11616:6;11672:3;11668:2;11664:12;11658:19;11635:42;;11727:6;11719;11715:19;11709:3;11701:6;11697:16;11690:45;;11758:52;11803:6;11786:15;11758:52;:::i;:::-;11868:12;;;;11748:62;-1:-1:-1;;;11833:15:156;;;;9385:1;9378:9;9349:2541;;;-1:-1:-1;11907:6:156;;8769:3150;-1:-1:-1;;;;;;;;8769:3150:156:o;12106:248::-;12171:6;12179;12232:2;12220:9;12211:7;12207:23;12203:32;12200:52;;;12248:1;12245;12238:12;12200:52;12284:9;12271:23;12261:33;;12313:35;12344:2;12333:9;12329:18;12313:35;:::i;:::-;12303:45;;12106:248;;;;;:::o;14561:408::-;14763:2;14745:21;;;14802:2;14782:18;;;14775:30;14841:34;14836:2;14821:18;;14814:62;-1:-1:-1;;;14907:2:156;14892:18;;14885:42;14959:3;14944:19;;14561:408::o;14974:::-;15176:2;15158:21;;;15215:2;15195:18;;;15188:30;15254:34;15249:2;15234:18;;15227:62;-1:-1:-1;;;15320:2:156;15305:18;;15298:42;15372:3;15357:19;;14974:408::o;15812:127::-;15873:10;15868:3;15864:20;15861:1;15854:31;15904:4;15901:1;15894:15;15928:4;15925:1;15918:15;15944:330;16042:4;16100:11;16087:25;16194:3;16190:8;16179;16163:14;16159:29;16155:44;16135:18;16131:69;16121:97;;16214:1;16211;16204:12;16121:97;16235:33;;;;;15944:330;-1:-1:-1;;15944:330:156:o;16279:196::-;16352:4;-1:-1:-1;;;;;16377:6:156;16374:30;16371:56;;;16407:18;;:::i;:::-;-1:-1:-1;16452:1:156;16448:14;16464:4;16444:25;;16279:196::o;16480:2310::-;16536:5;16584:4;16572:9;16567:3;16563:19;16559:30;16556:50;;;16602:1;16599;16592:12;16556:50;16624:22;;:::i;:::-;16615:31;;-1:-1:-1;;;;;16723:2:156;16711:9;16698:23;16695:31;16692:51;;;16739:1;16736;16729:12;16692:51;16790:9;16777:23;16766:9;16762:39;16839:3;16832:4;16828:2;16824:13;16820:23;16810:51;;16857:1;16854;16847:12;16810:51;16881:87;16897:70;16963:2;16950:16;16897:70;:::i;:::-;16881:87;:::i;:::-;17014:16;;17002:29;;;17056:4;17047:14;;;;16990:3;17100:1;17096:24;17088:33;;17084:44;17140:15;;;17137:35;;;17168:1;17165;17158:12;17137:35;17200:4;17196:2;17192:13;17214:1541;17230:6;17225:3;17222:15;17214:1541;;;17311:2;17305:3;17292:17;17289:25;17286:45;;;17327:1;17324;17317:12;17286:45;17362:17;;17354:26;;17428:4;17404:12;;;-1:-1:-1;;17400:26:156;17396:37;17393:57;;;17446:1;17443;17436:12;17393:57;17478:22;;:::i;:::-;17513:53;17559:4;17555:2;17551:13;17538:27;17513:53;:::i;:::-;17616:4;17612:2;17608:13;17595:27;17586:7;17579:44;17671:2;17663:4;17659:2;17655:13;17642:27;17639:35;17636:55;;;17687:1;17684;17677:12;17636:55;17743:4;17739:2;17735:13;17722:27;17718:2;17714:36;17704:46;;17790:3;17785:2;17781;17777:11;17773:21;17763:49;;17808:1;17805;17798:12;17763:49;17856:4;17852:2;17848:13;17835:27;17888:73;17904:56;17957:2;17904:56;:::i;17888:73::-;18005:17;;;18105:1;18101:10;;;;18093:19;;18114:4;18089:30;;18055:4;18044:16;;;18135:17;;;18132:37;;;18165:1;18162;18155:12;18132:37;18203:4;18199:2;18195:13;18182:26;;18221:411;18239:8;18232:5;18229:19;18221:411;;;18333:4;18325:5;18320:3;18316:15;18312:26;18309:46;;;18351:1;18348;18341:12;18309:46;18387:22;;:::i;:::-;18455:5;18442:19;18433:7;18426:36;18530:4;18523:5;18519:16;18506:30;18499:4;18490:7;18486:18;18479:58;18568:7;18561:5;18554:22;;18613:4;18606:5;18602:16;18593:25;;18271:4;18264:5;18260:16;18251:25;;18221:411;;;18672:5;18665:4;18656:7;18652:18;18645:33;;;;18703:7;18698:3;18691:20;;;18740:4;18735:3;18731:14;18724:21;;17256:4;17251:3;17247:14;17240:21;;17214:1541;;;-1:-1:-1;;18764:20:156;;-1:-1:-1;18771:5:156;;16480:2310;-1:-1:-1;;;;16480:2310:156:o;18795:3015::-;18973:9;19008:77;19024:60;19077:6;19024:60;:::i;19008:77::-;19107:3;19131:6;19126:3;19119:19;19157:4;19186;19181:3;19177:14;19170:21;;19232:6;19229:1;19225:14;19218:5;19214:26;19263:14;19255:6;19252:26;19249:46;;;19291:1;19288;19281:12;19249:46;19315:5;19329:2448;19345:6;19340:3;19337:15;19329:2448;;;19431:3;19418:17;-1:-1:-1;;;;;19508:2:156;19495:11;19492:19;19489:39;;;19524:1;19521;19514:12;19489:39;19562:11;19555:5;19551:23;19541:33;;19619:6;19614:2;19598:14;19594:23;19590:36;19587:56;;;19639:1;19636;19629:12;19587:56;19671:22;;:::i;:::-;19722:16;;19706:33;;19790:11;;;19777:25;19759:16;;;19752:51;19826:2;19879:11;;;19866:25;19848:16;;;19841:51;19915:2;19968:11;;;19955:25;19937:16;;;19930:51;20004:3;20058:11;;;20045:25;20027:16;;;20020:51;20094:3;20148:11;;;20135:25;20117:16;;;20110:51;20184:3;20238:11;;;20225:25;20207:16;;;20200:51;20274:3;20315:31;20334:11;;;20315:31;:::i;:::-;20297:16;;;20290:57;20371:3;20413:31;20431:12;;;20413:31;:::i;:::-;20394:17;;;20387:58;20469:3;20511:31;20529:12;;;20511:31;:::i;:::-;20492:17;;;20485:58;20567:3;20609:31;20627:12;;;20609:31;:::i;:::-;20590:17;;;20583:58;20665:3;20707:31;20725:12;;;20707:31;:::i;:::-;20688:17;;;20681:58;20763:3;20805:31;20823:12;;;20805:31;:::i;:::-;20786:17;;;20779:58;20861:3;20903:31;20921:12;;;20903:31;:::i;:::-;20884:17;;;20877:58;20959:3;21001:29;21017:12;;;21001:29;:::i;:::-;20982:17;;;20975:56;21055:3;21098:12;;;21085:26;21127:14;;;21124:34;;;21154:1;21151;21144:12;21124:34;21197:49;21231:14;21222:6;21218:2;21214:15;21197:49;:::i;:::-;21191:3;21182:7;21178:17;21171:76;;;21271:3;21324;21320:2;21316:12;21303:26;21358:2;21348:8;21345:16;21342:36;;;21374:1;21371;21364:12;21342:36;21417:51;21453:14;21442:8;21438:2;21434:17;21417:51;:::i;:::-;21411:3;21402:7;21398:17;21391:78;;;21493:3;21546;21542:2;21538:12;21525:26;21580:2;21570:8;21567:16;21564:36;;;21596:1;21593;21586:12;21564:36;21639:62;21686:14;21675:8;21671:2;21667:17;21639:62;:::i;:::-;21620:17;;;21613:89;;;;-1:-1:-1;21715:20:156;;-1:-1:-1;;21755:12:156;;;;19362;;19329:2448;;;-1:-1:-1;21799:5:156;;18795:3015;-1:-1:-1;;;;;;18795:3015:156:o;22225:184::-;22295:6;22348:2;22336:9;22327:7;22323:23;22319:32;22316:52;;;22364:1;22361;22354:12;22316:52;-1:-1:-1;22387:16:156;;22225:184;-1:-1:-1;22225:184:156:o;23515:251::-;23585:6;23638:2;23626:9;23617:7;23613:23;23609:32;23606:52;;;23654:1;23651;23644:12;23606:52;23686:9;23680:16;23705:31;23730:5;23705:31;:::i;23771:325::-;23865:4;23923:11;23910:25;24017:2;24013:7;24002:8;23986:14;23982:29;23978:43;23958:18;23954:68;23944:96;;24036:1;24033;24026:12;24101:580;24229:4;24235:6;24295:11;24282:25;24389:2;24385:7;24374:8;24358:14;24354:29;24350:43;24330:18;24326:68;24316:96;;24408:1;24405;24398:12;24316:96;24435:33;;24487:20;;;-1:-1:-1;;;;;;24519:30:156;;24516:50;;;24562:1;24559;24552:12;24516:50;24595:4;24583:17;;-1:-1:-1;24646:1:156;24642:14;;;24626;24622:35;24612:46;;24609:66;;;24671:1;24668;24661:12;24609:66;24101:580;;;;;:::o;24686:332::-;24787:4;24845:11;24832:25;24939:2;24935:7;24924:8;24908:14;24904:29;24900:43;24880:18;24876:68;24866:96;;24958:1;24955;24948:12;25023:584;25155:4;25161:6;25221:11;25208:25;25315:2;25311:7;25300:8;25284:14;25280:29;25276:43;25256:18;25252:68;25242:96;;25334:1;25331;25324:12;25242:96;25361:33;;25413:20;;;-1:-1:-1;;;;;;25445:30:156;;25442:50;;;25488:1;25485;25478:12;25442:50;25521:4;25509:17;;-1:-1:-1;25572:1:156;25568:14;;;25552;25548:35;25538:46;;25535:66;;;25597:1;25594;25587:12;25612:537;25741:6;25736:3;25729:19;25711:3;25767:4;25796;25791:3;25787:14;25780:21;;25824:5;25847:1;25857:267;25871:6;25868:1;25865:13;25857:267;;;25932:20;;25920:33;;26000:15;;;25987:29;25973:12;;;25966:51;26040:4;26064:12;;;;26099:15;;;;25893:1;25886:9;25857:267;;;-1:-1:-1;26140:3:156;;25612:537;-1:-1:-1;;;;;25612:537:156:o;26154:393::-;26419:2;26408:9;26401:21;26382:4;26439:102;26537:2;26526:9;26522:18;26514:6;26506;26439:102;:::i;26552:184::-;26610:6;26663:2;26651:9;26642:7;26638:23;26634:32;26631:52;;;26679:1;26676;26669:12;26631:52;26702:28;26720:9;26702:28;:::i;26741:500::-;26799:5;26806:6;26866:3;26853:17;26952:2;26948:7;26937:8;26921:14;26917:29;26913:43;26893:18;26889:68;26879:96;;26971:1;26968;26961:12;26879:96;26999:33;;27103:4;27090:18;;;-1:-1:-1;27051:21:156;;-1:-1:-1;;;;;;27120:30:156;;27117:50;;;27163:1;27160;27153:12;27117:50;27210:6;27194:14;27190:27;27183:5;27179:39;27176:59;;;27231:1;27228;27221:12;27246:266;27334:6;27329:3;27322:19;27386:6;27379:5;27372:4;27367:3;27363:14;27350:43;-1:-1:-1;27438:1:156;27413:16;;;27431:4;27409:27;;;27402:38;;;;27494:2;27473:15;;;-1:-1:-1;;27469:29:156;27460:39;;;27456:50;;27246:266::o;27517:294::-;27586:5;27645:3;27632:17;27731:2;27727:7;27716:8;27700:14;27696:29;27692:43;27672:18;27668:68;27658:96;;27750:1;27747;27740:12;27658:96;27772:33;;;;27517:294;-1:-1:-1;;27517:294:156:o;27816:2075::-;27877:3;27905:4;27939:2;27934:3;27930:12;27990:5;27977:19;28075:2;28071:7;28063:5;28047:14;28043:26;28039:40;28019:18;28015:65;28005:93;;28094:1;28091;28084:12;28005:93;28122:30;;28175:21;;28220:16;;;-1:-1:-1;;;;;28285:14:156;;;28282:34;;;28312:1;28309;28302:12;28282:34;28342:6;28339:1;28335:14;28394:2;28378:14;28374:23;28365:7;28361:37;28358:57;;;28411:1;28408;28401:12;28358:57;28424:15;;;28474:20;;;;28513:2;;28572:12;;28568:21;;28533:12;;;28637:1;28665:14;28661:28;;;-1:-1:-1;;28657:42:156;28708:1155;28722:6;28719:1;28716:13;28708:1155;;;28789:16;;;-1:-1:-1;;28785:30:156;28771:45;;28857:20;;28900:29;;;28890:57;;28943:1;28940;28933:12;28890:57;28970:34;;29045:11;;;29032:25;29070:33;29032:25;29070:33;:::i;:::-;-1:-1:-1;;;;;29131:33:156;29116:49;;29219:11;;;29206:25;29288:14;29284:23;;;-1:-1:-1;;29280:37:156;29254:64;;29244:92;;29332:1;29329;29322:12;29244:92;29359:29;29470:11;;;;29430;;29417:25;29497:16;;;29494:36;;;29526:1;29523;29516:12;29494:36;29586:8;29583:1;29579:16;29563:14;29559:37;29550:7;29546:51;29543:71;;;29610:1;29607;29600:12;29543:71;29651:2;29646;29638:6;29634:15;29627:27;29677:102;29775:2;29767:6;29763:15;29753:8;29744:7;29677:102;:::i;:::-;29802:15;;;;29667:112;-1:-1:-1;;;29839:14:156;;;;28744:1;28737:9;;;;;28708:1155;;;-1:-1:-1;29879:6:156;;27816:2075;-1:-1:-1;;;;;;;;;;;27816:2075:156:o;29896:2691::-;30087:2;30076:9;30069:21;30139:6;30126:20;30121:2;30110:9;30106:18;30099:48;30208:2;30200:6;30196:15;30183:29;30178:2;30167:9;30163:18;30156:57;30274:2;30266:6;30262:15;30249:29;30244:2;30233:9;30229:18;30222:57;30341:2;30333:6;30329:15;30316:29;30310:3;30299:9;30295:19;30288:58;30408:3;30400:6;30396:16;30383:30;30377:3;30366:9;30362:19;30355:59;30476:3;30468:6;30464:16;30451:30;30445:3;30434:9;30430:19;30423:59;30544:3;30536:6;30532:16;30519:30;30513:3;30502:9;30498:19;30491:59;30050:4;30579:36;30610:3;30602:6;30598:16;30579:36;:::i;:::-;30634:3;30646:52;30694:2;30683:9;30679:18;30665:12;-1:-1:-1;;;;;3646:31:156;3634:44;;3580:104;30646:52;30729:34;30759:2;30751:6;30747:15;30729:34;:::i;:::-;30707:56;;;30782:3;30794:53;30843:2;30832:9;30828:18;30812:14;-1:-1:-1;;;;;6505:30:156;6493:43;;6440:102;30794:53;30878:34;30908:2;30900:6;30896:15;30878:34;:::i;:::-;30856:56;;;30931:3;30943:53;30992:2;30981:9;30977:18;30961:14;6623:10;6612:22;6600:35;;6547:94;30943:53;31027:34;31057:2;31049:6;31045:15;31027:34;:::i;:::-;31005:56;;;31080:3;31092:53;31141:2;31130:9;31126:18;31110:14;6623:10;6612:22;6600:35;;6547:94;31092:53;31176:34;31206:2;31198:6;31194:15;31176:34;:::i;:::-;31154:56;;;31229:3;31241:53;31290:2;31279:9;31275:18;31259:14;-1:-1:-1;;;;;6505:30:156;6493:43;;6440:102;31241:53;31325:34;31355:2;31347:6;31343:15;31325:34;:::i;:::-;31303:56;;;31378:3;31390:53;31439:2;31428:9;31424:18;31408:14;6722:8;6711:20;6699:33;;6646:92;31390:53;31474:34;31504:2;31496:6;31492:15;31474:34;:::i;:::-;31452:56;;;31527:3;31539:53;31588:2;31577:9;31573:18;31557:14;6722:8;6711:20;6699:33;;6646:92;31539:53;31623:32;31651:2;31643:6;31639:15;31623:32;:::i;:::-;31601:54;;;31674:3;31686:51;31733:2;31722:9;31718:18;31702:14;2374:13;2367:21;2355:34;;2304:91;31686:51;31782:55;31833:2;31825:6;31821:15;31813:6;31782:55;:::i;:::-;31746:91;;;;31856:6;31882:3;31922:2;31916:3;31905:9;31901:19;31894:31;31948:76;32019:3;32008:9;32004:19;31990:12;31974:14;31948:76;:::i;:::-;31934:90;;32071:56;32122:3;32114:6;32110:16;32102:6;32071:56;:::i;:::-;32033:94;;;;32151:2;32147:7;32174:3;32242;32230:9;32222:6;32218:22;32214:32;32208:3;32197:9;32193:19;32186:61;32270:65;32328:6;32312:14;32296;32270:65;:::i;:::-;32256:79;;32367:67;32429:3;32421:6;32417:16;32409:6;32367:67;:::i;:::-;32344:90;;;32498:3;32486:9;32478:6;32474:22;32470:32;32465:2;32454:9;32450:18;32443:60;;;;32520:61;32574:6;32557:15;32520:61;:::i;:::-;32512:69;29896:2691;-1:-1:-1;;;;;29896:2691:156:o;32953:407::-;33155:2;33137:21;;;33194:2;33174:18;;;33167:30;33233:34;33228:2;33213:18;;33206:62;-1:-1:-1;;;33299:2:156;33284:18;;33277:41;33350:3;33335:19;;32953:407::o;33779:287::-;33908:3;33946:6;33940:13;33962:66;34021:6;34016:3;34009:4;34001:6;33997:17;33962:66;:::i;34429:219::-;34578:2;34567:9;34560:21;34541:4;34598:44;34638:2;34627:9;34623:18;34615:6;34598:44;:::i","linkReferences":{},"immutableReferences":{"22365":[{"start":1938,"length":32},{"start":2002,"length":32},{"start":2177,"length":32},{"start":2241,"length":32},{"start":2364,"length":32}]}},"methodIdentifiers":{"MAX_BYTES_PER_BLOB()":"81e3925f","SECURITY_DELAY_AFTER_PROVEN()":"6b5ad7e0","acceptOwnership()":"79ba5097","addressManager()":"3ab76e9f","getConfig()":"c3f909d4","impl()":"8abf6077","inNonReentrant()":"3075db56","init(address,address,bytes32)":"347258aa","isConfigValid((uint64,uint32,uint24))":"10f3ab1b","lastUnpausedAt()":"e07baba6","owner()":"8da5cb5b","pause()":"8456cb59","paused()":"5c975abb","pendingOwner()":"e30c3978","proposeBlock((bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,address,uint64,uint32,uint32,uint64,uint24,uint24,bool,bytes,bytes,((address,(bytes32,bytes32)[])[]))[])":"65cfd675","proxiableUUID()":"52d1902d","renounceOwnership()":"715018a6","resolve(bytes32,bool)":"a86f9d9e","resolve(uint64,bytes32,bool)":"3eb6b8cf","state()":"c19d93fb","transferOwnership(address)":"f2fde38b","unpause()":"3f4ba83a","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"FUNC_NOT_IMPLEMENTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"INVALID_PAUSE_STATUS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ALREADY_CONTESTED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ALREADY_PROVED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_ASSIGNED_PROVER_NOT_ALLOWED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOB_FOR_DA_DISABLED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOB_NOT_FOUND\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOB_NOT_REUSEABLE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_BLOCK_MISMATCH\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INCORRECT_BLOCK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INSUFFICIENT_TOKEN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_ADDRESS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_AMOUNT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_BLOCK_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_CONFIG\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_ETH_DEPOSIT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_L1_STATE_BLOCK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_OR_DUPLICATE_VERIFIER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PARAM\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PAUSE_STATUS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PROOF\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PROPOSER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_TIER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_TIMESTAMP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_INVALID_TRANSITION\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_LIVENESS_BOND_NOT_RECEIVED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_NOT_ASSIGNED_PROVER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROPOSER_NOT_EOA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_PROVING_PAUSED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_RECEIVE_DISABLED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TOO_MANY_BLOCKS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TOO_MANY_TIERS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TRANSITION_ID_ZERO\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TRANSITION_NOT_FOUND\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TXLIST_OFFSET_SIZE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_TXLIST_TOO_LARGE\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_UNAUTHORIZED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_UNEXPECTED_PARENT\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_UNEXPECTED_TRANSITION_ID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"L1_UNEXPECTED_TRANSITION_TIER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"REENTRANT_CALL\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_DENIED\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_INVALID_MANAGER\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RESOLVER_UNEXPECTED_CHAINID\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainId\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"name\",\"type\":\"bytes32\"}],\"name\":\"RESOLVER_ZERO_ADDR\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZERO_ADDRESS\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZERO_VALUE\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentMetaHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blobHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"extraData\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"l2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"l1StateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint24\",\"name\":\"txListByteOffset\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"txListByteSize\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"blobUsed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"stateDiffs\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"value\",\"type\":\"bytes32\"}],\"internalType\":\"struct TaikoData.StateDiffStorageSlot[]\",\"name\":\"slots\",\"type\":\"tuple[]\"}],\"internalType\":\"struct TaikoData.StateDiffAccount[]\",\"name\":\"accounts\",\"type\":\"tuple[]\"}],\"internalType\":\"struct TaikoData.StateDiff\",\"name\":\"l1StateDiff\",\"type\":\"tuple\"}],\"indexed\":false,\"internalType\":\"struct TaikoData.BlockMetadata\",\"name\":\"meta\",\"type\":\"tuple\"}],\"name\":\"BlockProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"name\":\"BlockVerified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"}],\"name\":\"ProvingPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"blockId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"parentBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"struct TaikoData.Transition\",\"name\":\"tran\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prover\",\"type\":\"address\"}],\"name\":\"TransitionProved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_BYTES_PER_BLOB\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SECURITY_DELAY_AFTER_PROVEN\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"blockMaxTxListBytes\",\"type\":\"uint24\"}],\"internalType\":\"struct TaikoData.Config\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"impl\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inNonReentrant\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_addressManager\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisBlockHash\",\"type\":\"bytes32\"}],\"name\":\"init\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainId\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"blockMaxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"blockMaxTxListBytes\",\"type\":\"uint24\"}],\"internalType\":\"struct TaikoData.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"isConfigValid\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUnpausedAt\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentMetaHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blobHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"extraData\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"l2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"l1StateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint24\",\"name\":\"txListByteOffset\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"txListByteSize\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"blobUsed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"stateDiffs\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"value\",\"type\":\"bytes32\"}],\"internalType\":\"struct TaikoData.StateDiffStorageSlot[]\",\"name\":\"slots\",\"type\":\"tuple[]\"}],\"internalType\":\"struct TaikoData.StateDiffAccount[]\",\"name\":\"accounts\",\"type\":\"tuple[]\"}],\"internalType\":\"struct TaikoData.StateDiff\",\"name\":\"l1StateDiff\",\"type\":\"tuple\"}],\"internalType\":\"struct TaikoData.BlockMetadata[]\",\"name\":\"data\",\"type\":\"tuple[]\"}],\"name\":\"proposeBlock\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"parentMetaHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"l1Hash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blobHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"extraData\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"l2BlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"l1StateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"timestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint24\",\"name\":\"txListByteOffset\",\"type\":\"uint24\"},{\"internalType\":\"uint24\",\"name\":\"txListByteSize\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"blobUsed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"stateDiffs\",\"type\":\"bytes\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"value\",\"type\":\"bytes32\"}],\"internalType\":\"struct TaikoData.StateDiffStorageSlot[]\",\"name\":\"slots\",\"type\":\"tuple[]\"}],\"internalType\":\"struct TaikoData.StateDiffAccount[]\",\"name\":\"accounts\",\"type\":\"tuple[]\"}],\"internalType\":\"struct TaikoData.StateDiff\",\"name\":\"l1StateDiff\",\"type\":\"tuple\"}],\"internalType\":\"struct TaikoData.BlockMetadata[]\",\"name\":\"_blocks\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainId\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_name\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_name\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_allowZeroAddress\",\"type\":\"bool\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"state\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"genesisHeight\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"genesisTimestamp\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"numBlocks\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"lastVerifiedBlockId\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"provingPaused\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"lastUnpausedAt\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is changed.\"},\"BlockProposed(uint256,(bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,address,uint64,uint32,uint32,uint64,uint24,uint24,bool,bytes,bytes,((address,(bytes32,bytes32)[])[])))\":{\"details\":\"Emitted when a block is proposed.\",\"params\":{\"blockId\":\"The ID of the proposed block.\",\"meta\":\"The block metadata containing information about the proposed block.\"}},\"BlockVerified(uint256,bytes32)\":{\"details\":\"Emitted when a block is verified.\",\"params\":{\"blockHash\":\"The hash of the verified block.\",\"blockId\":\"The ID of the verified block.\"}},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Paused(address)\":{\"params\":{\"account\":\"The account that paused the contract.\"}},\"TransitionProved(uint256,(bytes32,bytes32),address)\":{\"details\":\"Emitted when a block transition is proved or re-proved.\"},\"Unpaused(address)\":{\"params\":{\"account\":\"The account that unpaused the contract.\"}},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"getConfig()\":{\"returns\":{\"_0\":\"Config struct containing configuration parameters.\"}},\"init(address,address,bytes32)\":{\"params\":{\"_addressManager\":\"The {AddressManager} address.\",\"_genesisBlockHash\":\"The block hash of the genesis block.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"returns\":{\"_0\":\"true if paused, false otherwise.\"}},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"proposeBlock((bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,address,uint64,uint32,uint32,uint64,uint24,uint24,bool,bytes,bytes,((address,(bytes32,bytes32)[])[]))[])\":{\"details\":\"Proposes multiple Taiko L2 blocks.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"resolve(bytes32,bool)\":{\"params\":{\"_allowZeroAddress\":\"If set to true, does not throw if the resolved address is `address(0)`.\",\"_name\":\"Name whose address is to be resolved.\"},\"returns\":{\"_0\":\"Address associated with the given name.\"}},\"resolve(uint64,bytes32,bool)\":{\"params\":{\"_allowZeroAddress\":\"If set to true, does not throw if the resolved address is `address(0)`.\",\"_chainId\":\"The chainId of interest.\",\"_name\":\"Name whose address is to be resolved.\"},\"returns\":{\"_0\":\"Address associated with the given name on the specified chain.\"}},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"upgradeTo(address)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"title\":\"TaikoL1\",\"version\":1},\"userdoc\":{\"events\":{\"Paused(address)\":{\"notice\":\"Emitted when the contract is paused.\"},\"Unpaused(address)\":{\"notice\":\"Emitted when the contract is unpaused.\"}},\"kind\":\"user\",\"methods\":{\"addressManager()\":{\"notice\":\"Address of the AddressManager.\"},\"getConfig()\":{\"notice\":\"Gets the configuration of the TaikoL1 contract.\"},\"init(address,address,bytes32)\":{\"notice\":\"Initializes the rollup.\"},\"pause()\":{\"notice\":\"Pauses the contract.\"},\"paused()\":{\"notice\":\"Returns true if the contract is paused, and false otherwise.\"},\"resolve(bytes32,bool)\":{\"notice\":\"Resolves a name to its address deployed on this chain.\"},\"resolve(uint64,bytes32,bool)\":{\"notice\":\"Resolves a name to its address deployed on a specified chain.\"},\"unpause()\":{\"notice\":\"Unpauses the contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/TaikoL1.sol\":\"TaikoL1\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":p256-verifier/=node_modules/p256-verifier/\",\":solady/=node_modules/solady/\",\":solmate/=node_modules/solmate/src/\"]},\"sources\":{\"contracts/L1/TaikoData.sol\":{\"keccak256\":\"0xdb0f2523cb4db35c364757ea07185b9a0b051aef40b86aa2229128ce365a2a39\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c747bd047dea64b7da3fb6998df22a9bd05e743520f1bf2344b53650eafe9581\",\"dweb:/ipfs/QmXN28F2bkcsrv1SYukEmmteGs5eamvXv7Zkt7Mz8US87P\"]},\"contracts/L1/TaikoErrors.sol\":{\"keccak256\":\"0x7d1c24557fd5d59bc24d350eeac7b9b5156f3816535d7414dd32eb97f2aa9bf2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92d84503e0117af0d2df1eecc7ad6b90319114fe8312a1eae0d2409ca5ced968\",\"dweb:/ipfs/QmRraNzpSGxU9AFFReLGcCEngDqtwrYvS3y7wu66vQXRcd\"]},\"contracts/L1/TaikoEvents.sol\":{\"keccak256\":\"0x4b3212ed4ffae9fa6cb6e77dfab3abba378b7c4cc7f77cc44348bdc6e48dd916\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c4bb2736107feddfa8a2cf27c753008314b0bd647f40d6441bf530037329f639\",\"dweb:/ipfs/QmdxDjLXorDcL3Kaq1hStRCPBCzPom8KiMXCMudC1p3Loy\"]},\"contracts/L1/TaikoL1.sol\":{\"keccak256\":\"0xcb65f098d3df81db414d568948d162d86f11836a3f87ba3684f84d0ec9caebd8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://71f41537e2fd71f165f2d092c286bce28de13e3d11e9657819c56a2854e305c5\",\"dweb:/ipfs/QmevJEzDjZxpQKf1dWHLSuicBKheCJ2U66WK52XgEp3FEB\"]},\"contracts/L1/preconfs/ISequencerRegistry.sol\":{\"keccak256\":\"0x940d1e6293d53246d6b467969cea7945a2dec698b8d43b269ab3c2558c9da6c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7bafcedadd442709754a785a1c79e3c89036a83949686f58f23fb94e664996c0\",\"dweb:/ipfs/QmPnkvhPvYd4ALkpeA4gHWdjqqwjDr848Lm9pstsCSpQp4\"]},\"contracts/common/AddressResolver.sol\":{\"keccak256\":\"0xd1a5f2483f289b551c6f7ddc8ac56ea897ab634e1a821c151bb2ac6f4d449368\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://569ce06d944a73a66ff4345e769169254d06859858a2f5574a2caa5345cc1932\",\"dweb:/ipfs/Qma6wbCurte9ZEaPgoeyvhzgzw2KR2ok3Hn3tt6Skb9san\"]},\"contracts/common/EssentialContract.sol\":{\"keccak256\":\"0x843db2ea54ffd5f1ad137564e0d29db3c3e8a1e26801f71c1bd82b3e556c5a0a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2924468c472427fa53ec4360d0f96ef40fe9df4deea80d2a35bc6dee573fe81f\",\"dweb:/ipfs/QmXe8Vn4x5CJeUgJq43fgafrSbhRad9Y6NVrSPwYeJhDVR\"]},\"contracts/common/IAddressManager.sol\":{\"keccak256\":\"0x169642ab5b6fd6f555b68a9e9d553e34e71c1b61d02c26f68cb1cc0fa2124578\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://41141b4001dd3df0bd0daa5023318de7fdde82ad44450210495cadc0020745c6\",\"dweb:/ipfs/QmZZEmQww2DMyCQ6v7nqAKwun4XjRvgUXtfkbUTJ2cZkty\"]},\"contracts/common/IAddressResolver.sol\":{\"keccak256\":\"0xa7dbf8f4a541b9aefaf7f2626b8d775908d1f99e68be9890ce3ff6aabc7be291\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://30c6c584a8a1928ebcc07a13825a3219d4d35b0a68f4d75e31c8c34cc5adf3d1\",\"dweb:/ipfs/QmSmGCW2zvjueMUpoVmyC4BdEyHVns4TCd3GLfMjyoCcch\"]},\"contracts/gwyneth/GwynethContract.sol\":{\"keccak256\":\"0x89ae0384c01241bdd75ba90cb7e4be9571ead0f58f707736e564f3fdd815727c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5928e7ce620fdef1a00963cfeb4935d576bfef7b0f2f2eb8dfd8528b2ced1604\",\"dweb:/ipfs/QmVBVRrK2Uvt8x7nT4VmVWVS5nbePrBPQ47v2Ay12e8uFc\"]},\"contracts/libs/LibNetwork.sol\":{\"keccak256\":\"0x4a1f465396e0807a53308033de0521739fbaf6c3c14557f4da1471f8fa1139b0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a1a3a55911962a68c9bf418abe34664c968ee3f70804bedab945767c503a82fc\",\"dweb:/ipfs/QmW7ojvrV3m6WNsNJUqzs4DKiB1HMYGH8y8cTe77XVbCmM\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0x9140dabc466abab21b48b72dbda26736b1183a310d0e677d3719d201df026510\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://75267b14b60dc216d01d596a4008189a6c44d3314e53eded0edb1e757d95be16\",\"dweb:/ipfs/QmQoMaxTRT6V7uQj9USfdQH9jh1crywB9auVjThzUSAbG2\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x359a1ab89b46b9aba7bcad3fb651924baf4893d15153049b9976b0fc9be1358e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e89863421b4014b96a4b62be76eb3b9f0a8afe9684664a6f389124c0964bfe5c\",\"dweb:/ipfs/Qmbk7xr1irpDuU1WdxXgxELBXxs61rHhCgod7heVcvFx16\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b06267c5f80bad727af3e48b1382333d591dad51376399ef2f6b0ee6d58bf95\",\"dweb:/ipfs/QmdU5La1agcQvghnfMpWZGDPz2TUDTCxUwTLKmuMRXBpAx\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol\":{\"keccak256\":\"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e8fa670c3bdce78e642cc6ae11c4cb38b133499cdce5e1990a9979d424703263\",\"dweb:/ipfs/QmVxeCUk4jL2pXQyhsoNJwyU874wRufS2WvGe8TgPKPqhE\"]},\"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688\",\"dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr\"]},\"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol\":{\"keccak256\":\"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2db8e18505e86e02526847005d7287a33e397ed7fb9eaba3fd4a4a197add16e2\",\"dweb:/ipfs/QmW9BSuKTzHWHBNSHF4L8XfVuU1uJrP2vLg84YtBd8mL82\"]},\"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"node_modules/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0xc6619957bcc6641fe8984bfaf9ff11a9e4b97d8149c0495f608f9a2416d7c5cf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://543be67f7fa43b1b932637c1c7f12035f0f4b0f7ee2bd3c33841186f79c165c1\",\"dweb:/ipfs/QmSBPM2UVKbmJqWfD9i6hSiqbaE8TV4TSqfuiivziRRLKM\"]},\"node_modules/@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931\",\"dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da\",\"dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"type":"error","name":"FUNC_NOT_IMPLEMENTED"},{"inputs":[],"type":"error","name":"INVALID_PAUSE_STATUS"},{"inputs":[],"type":"error","name":"L1_ALREADY_CONTESTED"},{"inputs":[],"type":"error","name":"L1_ALREADY_PROVED"},{"inputs":[],"type":"error","name":"L1_ASSIGNED_PROVER_NOT_ALLOWED"},{"inputs":[],"type":"error","name":"L1_BLOB_FOR_DA_DISABLED"},{"inputs":[],"type":"error","name":"L1_BLOB_NOT_FOUND"},{"inputs":[],"type":"error","name":"L1_BLOB_NOT_REUSEABLE"},{"inputs":[],"type":"error","name":"L1_BLOCK_MISMATCH"},{"inputs":[],"type":"error","name":"L1_INCORRECT_BLOCK"},{"inputs":[],"type":"error","name":"L1_INSUFFICIENT_TOKEN"},{"inputs":[],"type":"error","name":"L1_INVALID_ADDRESS"},{"inputs":[],"type":"error","name":"L1_INVALID_AMOUNT"},{"inputs":[],"type":"error","name":"L1_INVALID_BLOCK_ID"},{"inputs":[],"type":"error","name":"L1_INVALID_CONFIG"},{"inputs":[],"type":"error","name":"L1_INVALID_ETH_DEPOSIT"},{"inputs":[],"type":"error","name":"L1_INVALID_L1_STATE_BLOCK"},{"inputs":[],"type":"error","name":"L1_INVALID_OR_DUPLICATE_VERIFIER"},{"inputs":[],"type":"error","name":"L1_INVALID_PARAM"},{"inputs":[],"type":"error","name":"L1_INVALID_PAUSE_STATUS"},{"inputs":[],"type":"error","name":"L1_INVALID_PROOF"},{"inputs":[],"type":"error","name":"L1_INVALID_PROPOSER"},{"inputs":[],"type":"error","name":"L1_INVALID_PROVER"},{"inputs":[],"type":"error","name":"L1_INVALID_TIER"},{"inputs":[],"type":"error","name":"L1_INVALID_TIMESTAMP"},{"inputs":[],"type":"error","name":"L1_INVALID_TRANSITION"},{"inputs":[],"type":"error","name":"L1_LIVENESS_BOND_NOT_RECEIVED"},{"inputs":[],"type":"error","name":"L1_NOT_ASSIGNED_PROVER"},{"inputs":[],"type":"error","name":"L1_PROPOSER_NOT_EOA"},{"inputs":[],"type":"error","name":"L1_PROVING_PAUSED"},{"inputs":[],"type":"error","name":"L1_RECEIVE_DISABLED"},{"inputs":[],"type":"error","name":"L1_TOO_MANY_BLOCKS"},{"inputs":[],"type":"error","name":"L1_TOO_MANY_TIERS"},{"inputs":[],"type":"error","name":"L1_TRANSITION_ID_ZERO"},{"inputs":[],"type":"error","name":"L1_TRANSITION_NOT_FOUND"},{"inputs":[],"type":"error","name":"L1_TXLIST_OFFSET_SIZE"},{"inputs":[],"type":"error","name":"L1_TXLIST_TOO_LARGE"},{"inputs":[],"type":"error","name":"L1_UNAUTHORIZED"},{"inputs":[],"type":"error","name":"L1_UNEXPECTED_PARENT"},{"inputs":[],"type":"error","name":"L1_UNEXPECTED_TRANSITION_ID"},{"inputs":[],"type":"error","name":"L1_UNEXPECTED_TRANSITION_TIER"},{"inputs":[],"type":"error","name":"REENTRANT_CALL"},{"inputs":[],"type":"error","name":"RESOLVER_DENIED"},{"inputs":[],"type":"error","name":"RESOLVER_INVALID_MANAGER"},{"inputs":[],"type":"error","name":"RESOLVER_UNEXPECTED_CHAINID"},{"inputs":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"type":"error","name":"RESOLVER_ZERO_ADDR"},{"inputs":[],"type":"error","name":"ZERO_ADDRESS"},{"inputs":[],"type":"error","name":"ZERO_VALUE"},{"inputs":[{"internalType":"address","name":"previousAdmin","type":"address","indexed":false},{"internalType":"address","name":"newAdmin","type":"address","indexed":false}],"type":"event","name":"AdminChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"beacon","type":"address","indexed":true}],"type":"event","name":"BeaconUpgraded","anonymous":false},{"inputs":[{"internalType":"uint256","name":"blockId","type":"uint256","indexed":true},{"internalType":"struct TaikoData.BlockMetadata","name":"meta","type":"tuple","components":[{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentMetaHash","type":"bytes32"},{"internalType":"bytes32","name":"l1Hash","type":"bytes32"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"bytes32","name":"blobHash","type":"bytes32"},{"internalType":"bytes32","name":"extraData","type":"bytes32"},{"internalType":"address","name":"coinbase","type":"address"},{"internalType":"uint64","name":"l2BlockNumber","type":"uint64"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"uint32","name":"l1StateBlockNumber","type":"uint32"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint24","name":"txListByteOffset","type":"uint24"},{"internalType":"uint24","name":"txListByteSize","type":"uint24"},{"internalType":"bool","name":"blobUsed","type":"bool"},{"internalType":"bytes","name":"txList","type":"bytes"},{"internalType":"bytes","name":"stateDiffs","type":"bytes"},{"internalType":"struct TaikoData.StateDiff","name":"l1StateDiff","type":"tuple","components":[{"internalType":"struct TaikoData.StateDiffAccount[]","name":"accounts","type":"tuple[]","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"struct TaikoData.StateDiffStorageSlot[]","name":"slots","type":"tuple[]","components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"bytes32","name":"value","type":"bytes32"}]}]}]}],"indexed":false}],"type":"event","name":"BlockProposed","anonymous":false},{"inputs":[{"internalType":"uint256","name":"blockId","type":"uint256","indexed":true},{"internalType":"bytes32","name":"blockHash","type":"bytes32","indexed":false}],"type":"event","name":"BlockVerified","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferStarted","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"bool","name":"paused","type":"bool","indexed":false}],"type":"event","name":"ProvingPaused","anonymous":false},{"inputs":[{"internalType":"uint256","name":"blockId","type":"uint256","indexed":true},{"internalType":"struct TaikoData.Transition","name":"tran","type":"tuple","components":[{"internalType":"bytes32","name":"parentBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"}],"indexed":false},{"internalType":"address","name":"prover","type":"address","indexed":false}],"type":"event","name":"TransitionProved","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BYTES_PER_BLOB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"SECURITY_DELAY_AFTER_PROVEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"acceptOwnership"},{"inputs":[],"stateMutability":"view","type":"function","name":"addressManager","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"getConfig","outputs":[{"internalType":"struct TaikoData.Config","name":"","type":"tuple","components":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint32","name":"blockMaxGasLimit","type":"uint32"},{"internalType":"uint24","name":"blockMaxTxListBytes","type":"uint24"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"impl","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"inNonReentrant","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_addressManager","type":"address"},{"internalType":"bytes32","name":"_genesisBlockHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"function","name":"init"},{"inputs":[{"internalType":"struct TaikoData.Config","name":"config","type":"tuple","components":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint32","name":"blockMaxGasLimit","type":"uint32"},{"internalType":"uint24","name":"blockMaxTxListBytes","type":"uint24"}]}],"stateMutability":"pure","type":"function","name":"isConfigValid","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"lastUnpausedAt","outputs":[{"internalType":"uint64","name":"","type":"uint64"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"pause"},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"struct TaikoData.BlockMetadata[]","name":"data","type":"tuple[]","components":[{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentMetaHash","type":"bytes32"},{"internalType":"bytes32","name":"l1Hash","type":"bytes32"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"bytes32","name":"blobHash","type":"bytes32"},{"internalType":"bytes32","name":"extraData","type":"bytes32"},{"internalType":"address","name":"coinbase","type":"address"},{"internalType":"uint64","name":"l2BlockNumber","type":"uint64"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"uint32","name":"l1StateBlockNumber","type":"uint32"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint24","name":"txListByteOffset","type":"uint24"},{"internalType":"uint24","name":"txListByteSize","type":"uint24"},{"internalType":"bool","name":"blobUsed","type":"bool"},{"internalType":"bytes","name":"txList","type":"bytes"},{"internalType":"bytes","name":"stateDiffs","type":"bytes"},{"internalType":"struct TaikoData.StateDiff","name":"l1StateDiff","type":"tuple","components":[{"internalType":"struct TaikoData.StateDiffAccount[]","name":"accounts","type":"tuple[]","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"struct TaikoData.StateDiffStorageSlot[]","name":"slots","type":"tuple[]","components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"bytes32","name":"value","type":"bytes32"}]}]}]}]}],"stateMutability":"payable","type":"function","name":"proposeBlock","outputs":[{"internalType":"struct TaikoData.BlockMetadata[]","name":"_blocks","type":"tuple[]","components":[{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentBlockHash","type":"bytes32"},{"internalType":"bytes32","name":"parentMetaHash","type":"bytes32"},{"internalType":"bytes32","name":"l1Hash","type":"bytes32"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"bytes32","name":"blobHash","type":"bytes32"},{"internalType":"bytes32","name":"extraData","type":"bytes32"},{"internalType":"address","name":"coinbase","type":"address"},{"internalType":"uint64","name":"l2BlockNumber","type":"uint64"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"uint32","name":"l1StateBlockNumber","type":"uint32"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"uint24","name":"txListByteOffset","type":"uint24"},{"internalType":"uint24","name":"txListByteSize","type":"uint24"},{"internalType":"bool","name":"blobUsed","type":"bool"},{"internalType":"bytes","name":"txList","type":"bytes"},{"internalType":"bytes","name":"stateDiffs","type":"bytes"},{"internalType":"struct TaikoData.StateDiff","name":"l1StateDiff","type":"tuple","components":[{"internalType":"struct TaikoData.StateDiffAccount[]","name":"accounts","type":"tuple[]","components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"struct TaikoData.StateDiffStorageSlot[]","name":"slots","type":"tuple[]","components":[{"internalType":"bytes32","name":"key","type":"bytes32"},{"internalType":"bytes32","name":"value","type":"bytes32"}]}]}]}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"uint64","name":"_chainId","type":"uint64"},{"internalType":"bytes32","name":"_name","type":"bytes32"},{"internalType":"bool","name":"_allowZeroAddress","type":"bool"}],"stateMutability":"view","type":"function","name":"resolve","outputs":[{"internalType":"address payable","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"_name","type":"bytes32"},{"internalType":"bool","name":"_allowZeroAddress","type":"bool"}],"stateMutability":"view","type":"function","name":"resolve","outputs":[{"internalType":"address payable","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"state","outputs":[{"internalType":"uint64","name":"genesisHeight","type":"uint64"},{"internalType":"uint64","name":"genesisTimestamp","type":"uint64"},{"internalType":"uint64","name":"numBlocks","type":"uint64"},{"internalType":"uint64","name":"lastVerifiedBlockId","type":"uint64"},{"internalType":"bool","name":"provingPaused","type":"bool"},{"internalType":"uint64","name":"lastUnpausedAt","type":"uint64"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"unpause"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"upgradeTo"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"}],"devdoc":{"kind":"dev","methods":{"acceptOwnership()":{"details":"The new owner accepts the ownership transfer."},"getConfig()":{"returns":{"_0":"Config struct containing configuration parameters."}},"init(address,address,bytes32)":{"params":{"_addressManager":"The {AddressManager} address.","_genesisBlockHash":"The block hash of the genesis block."}},"owner()":{"details":"Returns the address of the current owner."},"paused()":{"returns":{"_0":"true if paused, false otherwise."}},"pendingOwner()":{"details":"Returns the address of the pending owner."},"proposeBlock((bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,address,uint64,uint32,uint32,uint64,uint24,uint24,bool,bytes,bytes,((address,(bytes32,bytes32)[])[]))[])":{"details":"Proposes multiple Taiko L2 blocks."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"resolve(bytes32,bool)":{"params":{"_allowZeroAddress":"If set to true, does not throw if the resolved address is `address(0)`.","_name":"Name whose address is to be resolved."},"returns":{"_0":"Address associated with the given name."}},"resolve(uint64,bytes32,bool)":{"params":{"_allowZeroAddress":"If set to true, does not throw if the resolved address is `address(0)`.","_chainId":"The chainId of interest.","_name":"Name whose address is to be resolved."},"returns":{"_0":"Address associated with the given name on the specified chain."}},"transferOwnership(address)":{"details":"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner."},"upgradeTo(address)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"upgradeToAndCall(address,bytes)":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."}},"version":1},"userdoc":{"kind":"user","methods":{"addressManager()":{"notice":"Address of the AddressManager."},"getConfig()":{"notice":"Gets the configuration of the TaikoL1 contract."},"init(address,address,bytes32)":{"notice":"Initializes the rollup."},"pause()":{"notice":"Pauses the contract."},"paused()":{"notice":"Returns true if the contract is paused, and false otherwise."},"resolve(bytes32,bool)":{"notice":"Resolves a name to its address deployed on this chain."},"resolve(uint64,bytes32,bool)":{"notice":"Resolves a name to its address deployed on a specified chain."},"unpause()":{"notice":"Unpauses the contract."}},"version":1}},"settings":{"remappings":["@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/","ds-test/=node_modules/ds-test/src/","forge-std/=node_modules/forge-std/src/","p256-verifier/=node_modules/p256-verifier/","solady/=node_modules/solady/","solmate/=node_modules/solmate/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"contracts/L1/TaikoL1.sol":"TaikoL1"},"evmVersion":"cancun","libraries":{}},"sources":{"contracts/L1/TaikoData.sol":{"keccak256":"0xdb0f2523cb4db35c364757ea07185b9a0b051aef40b86aa2229128ce365a2a39","urls":["bzz-raw://c747bd047dea64b7da3fb6998df22a9bd05e743520f1bf2344b53650eafe9581","dweb:/ipfs/QmXN28F2bkcsrv1SYukEmmteGs5eamvXv7Zkt7Mz8US87P"],"license":"MIT"},"contracts/L1/TaikoErrors.sol":{"keccak256":"0x7d1c24557fd5d59bc24d350eeac7b9b5156f3816535d7414dd32eb97f2aa9bf2","urls":["bzz-raw://92d84503e0117af0d2df1eecc7ad6b90319114fe8312a1eae0d2409ca5ced968","dweb:/ipfs/QmRraNzpSGxU9AFFReLGcCEngDqtwrYvS3y7wu66vQXRcd"],"license":"MIT"},"contracts/L1/TaikoEvents.sol":{"keccak256":"0x4b3212ed4ffae9fa6cb6e77dfab3abba378b7c4cc7f77cc44348bdc6e48dd916","urls":["bzz-raw://c4bb2736107feddfa8a2cf27c753008314b0bd647f40d6441bf530037329f639","dweb:/ipfs/QmdxDjLXorDcL3Kaq1hStRCPBCzPom8KiMXCMudC1p3Loy"],"license":"MIT"},"contracts/L1/TaikoL1.sol":{"keccak256":"0xcb65f098d3df81db414d568948d162d86f11836a3f87ba3684f84d0ec9caebd8","urls":["bzz-raw://71f41537e2fd71f165f2d092c286bce28de13e3d11e9657819c56a2854e305c5","dweb:/ipfs/QmevJEzDjZxpQKf1dWHLSuicBKheCJ2U66WK52XgEp3FEB"],"license":"MIT"},"contracts/L1/preconfs/ISequencerRegistry.sol":{"keccak256":"0x940d1e6293d53246d6b467969cea7945a2dec698b8d43b269ab3c2558c9da6c5","urls":["bzz-raw://7bafcedadd442709754a785a1c79e3c89036a83949686f58f23fb94e664996c0","dweb:/ipfs/QmPnkvhPvYd4ALkpeA4gHWdjqqwjDr848Lm9pstsCSpQp4"],"license":"MIT"},"contracts/common/AddressResolver.sol":{"keccak256":"0xd1a5f2483f289b551c6f7ddc8ac56ea897ab634e1a821c151bb2ac6f4d449368","urls":["bzz-raw://569ce06d944a73a66ff4345e769169254d06859858a2f5574a2caa5345cc1932","dweb:/ipfs/Qma6wbCurte9ZEaPgoeyvhzgzw2KR2ok3Hn3tt6Skb9san"],"license":"MIT"},"contracts/common/EssentialContract.sol":{"keccak256":"0x843db2ea54ffd5f1ad137564e0d29db3c3e8a1e26801f71c1bd82b3e556c5a0a","urls":["bzz-raw://2924468c472427fa53ec4360d0f96ef40fe9df4deea80d2a35bc6dee573fe81f","dweb:/ipfs/QmXe8Vn4x5CJeUgJq43fgafrSbhRad9Y6NVrSPwYeJhDVR"],"license":"MIT"},"contracts/common/IAddressManager.sol":{"keccak256":"0x169642ab5b6fd6f555b68a9e9d553e34e71c1b61d02c26f68cb1cc0fa2124578","urls":["bzz-raw://41141b4001dd3df0bd0daa5023318de7fdde82ad44450210495cadc0020745c6","dweb:/ipfs/QmZZEmQww2DMyCQ6v7nqAKwun4XjRvgUXtfkbUTJ2cZkty"],"license":"MIT"},"contracts/common/IAddressResolver.sol":{"keccak256":"0xa7dbf8f4a541b9aefaf7f2626b8d775908d1f99e68be9890ce3ff6aabc7be291","urls":["bzz-raw://30c6c584a8a1928ebcc07a13825a3219d4d35b0a68f4d75e31c8c34cc5adf3d1","dweb:/ipfs/QmSmGCW2zvjueMUpoVmyC4BdEyHVns4TCd3GLfMjyoCcch"],"license":"MIT"},"contracts/gwyneth/GwynethContract.sol":{"keccak256":"0x89ae0384c01241bdd75ba90cb7e4be9571ead0f58f707736e564f3fdd815727c","urls":["bzz-raw://5928e7ce620fdef1a00963cfeb4935d576bfef7b0f2f2eb8dfd8528b2ced1604","dweb:/ipfs/QmVBVRrK2Uvt8x7nT4VmVWVS5nbePrBPQ47v2Ay12e8uFc"],"license":"MIT"},"contracts/libs/LibNetwork.sol":{"keccak256":"0x4a1f465396e0807a53308033de0521739fbaf6c3c14557f4da1471f8fa1139b0","urls":["bzz-raw://a1a3a55911962a68c9bf418abe34664c968ee3f70804bedab945767c503a82fc","dweb:/ipfs/QmW7ojvrV3m6WNsNJUqzs4DKiB1HMYGH8y8cTe77XVbCmM"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol":{"keccak256":"0x9140dabc466abab21b48b72dbda26736b1183a310d0e677d3719d201df026510","urls":["bzz-raw://75267b14b60dc216d01d596a4008189a6c44d3314e53eded0edb1e757d95be16","dweb:/ipfs/QmQoMaxTRT6V7uQj9USfdQH9jh1crywB9auVjThzUSAbG2"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"keccak256":"0x359a1ab89b46b9aba7bcad3fb651924baf4893d15153049b9976b0fc9be1358e","urls":["bzz-raw://e89863421b4014b96a4b62be76eb3b9f0a8afe9684664a6f389124c0964bfe5c","dweb:/ipfs/Qmbk7xr1irpDuU1WdxXgxELBXxs61rHhCgod7heVcvFx16"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"keccak256":"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794","urls":["bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e","dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"keccak256":"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422","urls":["bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b","dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq"],"license":"MIT"},"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"keccak256":"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef","urls":["bzz-raw://8b06267c5f80bad727af3e48b1382333d591dad51376399ef2f6b0ee6d58bf95","dweb:/ipfs/QmdU5La1agcQvghnfMpWZGDPz2TUDTCxUwTLKmuMRXBpAx"],"license":"MIT"},"node_modules/@openzeppelin/contracts/interfaces/IERC1967.sol":{"keccak256":"0x3cbef5ebc24b415252e2f8c0c9254555d30d9f085603b4b80d9b5ed20ab87e90","urls":["bzz-raw://e8fa670c3bdce78e642cc6ae11c4cb38b133499cdce5e1990a9979d424703263","dweb:/ipfs/QmVxeCUk4jL2pXQyhsoNJwyU874wRufS2WvGe8TgPKPqhE"],"license":"MIT"},"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"keccak256":"0x1d4afe6cb24200cc4545eed814ecf5847277dfe5d613a1707aad5fceecebcfff","urls":["bzz-raw://383fb7b8181016ac5ccf07bc9cdb7c1b5045ea36e2cc4df52bcbf20396fc7688","dweb:/ipfs/QmYJ7Cg4WmE3rR8KGQxjUCXFfTH6TcwZ2Z1f6tPrq7jHFr"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol":{"keccak256":"0x3b21ae06bf5957f73fa16754b0669c77b7abd8ba6c072d35c3281d446fdb86c2","urls":["bzz-raw://2db8e18505e86e02526847005d7287a33e397ed7fb9eaba3fd4a4a197add16e2","dweb:/ipfs/QmW9BSuKTzHWHBNSHF4L8XfVuU1uJrP2vLg84YtBd8mL82"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"node_modules/@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0xc6619957bcc6641fe8984bfaf9ff11a9e4b97d8149c0495f608f9a2416d7c5cf","urls":["bzz-raw://543be67f7fa43b1b932637c1c7f12035f0f4b0f7ee2bd3c33841186f79c165c1","dweb:/ipfs/QmSBPM2UVKbmJqWfD9i6hSiqbaE8TV4TSqfuiivziRRLKM"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"keccak256":"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa","urls":["bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931","dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm"],"license":"MIT"},"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol":{"keccak256":"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899","urls":["bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da","dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q"],"license":"MIT"}},"version":1},"id":4} \ No newline at end of file diff --git a/crates/gwyneth/src/builder.rs b/crates/gwyneth/src/builder.rs index 0cbb9dc107f1..c184451e3f8c 100644 --- a/crates/gwyneth/src/builder.rs +++ b/crates/gwyneth/src/builder.rs @@ -309,6 +309,9 @@ where ) .filter_current_chain(); + println!("coinbase: {:?}", initialized_block_env.coinbase); + println!("basefee: {:?}", base_fee); + let state_diff = execution_outcome_to_state_diff(&execution_outcome); let receipts_root = @@ -379,16 +382,20 @@ where requests_root, }; - println!("Build 15"); + println!("header: {:?}", header); // seal the block let block = Block { header, body: executed_txs, ommers: vec![], withdrawals, requests }; - let mut sealed_block = block.seal_slow(); + let sealed_block = block.seal_slow(); //sealed_block.state_diff = Some(execution_outcome_to_state_diff(&execution_outcome)); + println!("block hash: {:?}", sealed_block.hash()); + println!("execution outcome: {:?}", execution_outcome); + assert_eq!(state_diff, attributes.state_diff.unwrap()); + debug!(target: "payload_builder", ?sealed_block, "sealed built block"); total_fees = U256::from(1u64); diff --git a/crates/gwyneth/src/exex.rs b/crates/gwyneth/src/exex.rs index a9414f8ed4f1..6130f59f058c 100644 --- a/crates/gwyneth/src/exex.rs +++ b/crates/gwyneth/src/exex.rs @@ -18,7 +18,7 @@ use reth_node_builder::{components::Components, FullNode, Node, NodeAdapter}; use reth_node_ethereum::{node::EthereumAddOns, EthExecutorProvider}; use reth_payload_builder::EthBuiltPayload; use reth_primitives::{ - address, Address, SealedBlock, SealedBlockWithSenders, TransactionSigned, B256, U256, + address, Address, SealedBlock, SealedBlockWithSenders, StateDiff, TransactionSigned, B256, U256 }; use reth_provider::{ providers::BlockchainProvider, BlockNumReader, CanonStateSubscriptions, DatabaseProviderFactory, @@ -126,13 +126,24 @@ impl Rollup { }) = event { println!("block_number: {:?}", block_number); + println!("block hash: {:?}", meta.blockHash); println!("tx_list: {:?}", meta.txList); + println!("state diffs: {:?}", meta.stateDiffs); + //println!("L1 state diff: {:?}", meta.l1StateDiff.); let transactions: Vec = decode_transactions(&meta.txList); println!("transactions: {:?}", transactions); + let state_diffs: HashMap = bincode::deserialize(&meta.stateDiffs.to_vec()).unwrap_or_else(|err| { + panic!("State diff can't be decoded: {}", err); + }); + println!("state_diffs: {:?}", state_diffs); + let all_transactions: Vec = decode_transactions(&meta.txList); let node_chain_id = BASE_CHAIN_ID + (node_idx as u64); + let state_diff = state_diffs.get(&node_chain_id); + println!("state_diff: {:?}", state_diff); + // let filtered_transactions: Vec = all_transactions // .into_iter() // .filter(|tx| tx.chain_id() == Some(node_chain_id)) @@ -147,13 +158,14 @@ impl Rollup { let attrs = GwynethPayloadAttributes { inner: EthPayloadAttributes { - timestamp: block.timestamp + node_idx as u64, + timestamp: block.timestamp/* + node_idx as u64*/, prev_randao: B256::ZERO, - suggested_fee_recipient: Address::ZERO, + suggested_fee_recipient: meta.coinbase, withdrawals: Some(vec![]), - parent_beacon_block_root: Some(B256::ZERO), + parent_beacon_block_root: block.parent_beacon_block_root, }, transactions: Some(filtered_transactions.clone()), + state_diff: state_diff.map(|s| s.clone()), gas_limit: None, }; @@ -239,6 +251,8 @@ impl Rollup { ) .await?; + assert_eq!(block_hash, meta.blockHash, "unexpected block hash"); + // trigger forkchoice update via engine api to commit the block to the blockchain self.engine_apis[node_idx].update_forkchoice(block_hash, block_hash).await?; diff --git a/crates/gwyneth/src/lib.rs b/crates/gwyneth/src/lib.rs index 4b5bd11c4614..adc3e4f84248 100644 --- a/crates/gwyneth/src/lib.rs +++ b/crates/gwyneth/src/lib.rs @@ -3,7 +3,7 @@ use std::{collections::HashMap, fmt::Debug, sync::Arc}; use builder::default_gwyneth_payload_builder; use reth_evm_ethereum::EthEvmConfig; -use reth_primitives::ChainId; +use reth_primitives::{ChainId, StateDiff}; use reth_tasks::TaskManager; use thiserror::Error; @@ -67,6 +67,9 @@ pub struct GwynethPayloadAttributes { /// Transactions is a field for rollups: the transactions list is forced into the block #[serde(skip_serializing_if = "Option::is_none")] pub transactions: Option>, + /// Transactions is a field for rollups: the transactions list is forced into the block + #[serde(skip_serializing_if = "Option::is_none")] + pub state_diff: Option, /// If set, this sets the exact gas limit the block produced with. #[serde(skip_serializing_if = "Option::is_none", with = "alloy_serde::quantity::opt")] pub gas_limit: Option, @@ -110,6 +113,8 @@ pub struct GwynethPayloadBuilderAttributes { /// Decoded transactions and the original EIP-2718 encoded bytes as received in the payload /// attributes. pub transactions: Vec>, + /// state diff + pub state_diff: Option, /// The gas limit for the generated payload pub gas_limit: Option, @@ -136,6 +141,7 @@ impl PayloadBuilderAttributes Ok(Self { inner: EthPayloadBuilderAttributes::new(parent, attributes.inner), transactions, + state_diff: attributes.state_diff, gas_limit: attributes.gas_limit, providers: HashMap::default(), }) diff --git a/etc/assertoor/assertoor-template.yaml b/etc/assertoor/assertoor-template.yaml index 16e4be914e7e..7341e2434045 100644 --- a/etc/assertoor/assertoor-template.yaml +++ b/etc/assertoor/assertoor-template.yaml @@ -7,7 +7,7 @@ participants: - el_type: reth el_image: ghcr.io/paradigmxyz/reth cl_type: teku - cl_image: consensys/teku:latest + cl_image: sigp/lighthouse:latest count: 1 - el_type: reth el_image: ghcr.io/paradigmxyz/reth diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index cd17ba3a2618..0441cd645eff 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -153,9 +153,9 @@ contract TaikoL1 is EssentialContract, TaikoEvents, TaikoErrors { // Apply L1 state updates - for (uint i = 0; i < _block.l1StateDiff.accounts.length; i++) { - GwynethContract(_block.l1StateDiff.accounts[i].addr).applyStateDelta(_block.l1StateDiff.accounts[i].slots); - } + // for (uint i = 0; i < _block.l1StateDiff.accounts.length; i++) { + // GwynethContract(_block.l1StateDiff.accounts[i].addr).applyStateDelta(_block.l1StateDiff.accounts[i].slots); + // } emit BlockProposed({ blockId: _block.l2BlockNumber, meta: _block }); } diff --git a/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py b/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py index 2e16b3df106f..eb9321d03a96 100644 --- a/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py +++ b/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py @@ -78,4 +78,4 @@ def simulate_blockchain_call(contract_address, abi, function_name, *args): print("Alice balance:") simulate_blockchain_call(example_contract_address, example_abi, "balanceOf", "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266") print("Bob balance:") - simulate_blockchain_call(example_contract_address, example_abi, "balanceOf", "0x70997970C51812dc3A010C7d01b50e0d17dc79C8") \ No newline at end of file + simulate_blockchain_call(example_contract_address, example_abi, "balanceOf", "0xE25583099BA105D9ec0A67f5Ae86D90e50036425") \ No newline at end of file diff --git a/packages/protocol/scripts/confs/network_params.yaml b/packages/protocol/scripts/confs/network_params.yaml index e0c2a2bb1d76..445bca9f4603 100644 --- a/packages/protocol/scripts/confs/network_params.yaml +++ b/packages/protocol/scripts/confs/network_params.yaml @@ -5,11 +5,6 @@ participants: cl_image: sigp/lighthouse:latest el_extra_params: ["--num_of_l2s", "2"] cl_extra_params: [--always-prepare-payload, --prepare-payload-lookahead, "12000"] - - el_type: reth - el_image: taiko_reth - cl_type: teku - cl_image: consensys/teku:latest - el_extra_params: ["--num_of_l2s", "2"] network_params: network_id: '160010' additional_services: diff --git a/packages/protocol/scripts/xTransfer.s.sol b/packages/protocol/scripts/xTransfer.s.sol index fdeacc02ead3..5e0d3ce0e449 100644 --- a/packages/protocol/scripts/xTransfer.s.sol +++ b/packages/protocol/scripts/xTransfer.s.sol @@ -11,14 +11,22 @@ contract XTransfer is Script { address constant TOKEN_ADDRESS = 0x5FbDB2315678afecb367f032d93F642f64180aa3; address ALICE = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; //Can stay as is - test values anyways - address BOB = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; //Can stay as is - test values anyways + address BOB = 0xE25583099BA105D9ec0A67f5Ae86D90e50036425; //Can stay as is - test values anyways + address CHARLIE = 0x614561D2d143621E126e87831AEF287678B442b8; //Can stay as is - test values anyways uint256 ALICE_PK = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80;//Can stay as is - test values anyways + uint256 BOB_PK = 0x39725efee3fb28614de3bacaffe4cc4bd8c436257e2c8bb887c4b5c4be45e76d;//Can stay as is - test values anyways function setUp() public {} function run() public { address alice = vm.addr(ALICE_PK); + vm.startBroadcast(); + // Sending 1 ETH + (bool success, ) = alice.call{value: 1 ether}(""); + require(success, "Failed to send Ether"); + vm.stopBroadcast(); + console.log("\n=== Before Transfer ==="); //checkBalances(); -> EXPLORER @@ -29,6 +37,13 @@ contract XTransfer is Script { vm.stopBroadcast(); + vm.startBroadcast(BOB_PK); + + // Withdraw some tokens to L1 + xERC20(TOKEN_ADDRESS).xTransfer(160010, CHARLIE, 222); + + vm.stopBroadcast(); + console.log("\n=== After Transfer ==="); //checkBalances(); -> EXPLORER } From a9eeb295e8209129fc18a7d5de256319f2a3a1c7 Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Thu, 2 Jan 2025 01:19:38 +0100 Subject: [PATCH 18/24] DA improvements + more fixes to make reth build the same block as rbuilder --- crates/evm/execution-types/src/state_diff.rs | 5 +- crates/gwyneth/src/builder.rs | 84 +++----------------- crates/gwyneth/src/exex.rs | 18 ++--- crates/gwyneth/src/lib.rs | 11 ++- crates/primitives/src/block.rs | 48 ++++++++++- crates/primitives/src/lib.rs | 2 +- 6 files changed, 73 insertions(+), 95 deletions(-) diff --git a/crates/evm/execution-types/src/state_diff.rs b/crates/evm/execution-types/src/state_diff.rs index 635d18a3f4bf..689557075799 100644 --- a/crates/evm/execution-types/src/state_diff.rs +++ b/crates/evm/execution-types/src/state_diff.rs @@ -1,8 +1,7 @@ use std::collections::HashMap; use reth_primitives::{ - StateDiff, StateDiffAccount, StateDiffStorageSlot, - constants::{eip4844::MAX_DATA_GAS_PER_BLOCK, BEACON_NONCE}, eip4844::calculate_excess_blob_gas, proofs::{self, calculate_requests_root}, Block, BlockNumber, ChainId, EthereumHardforks, Header, Receipt, Receipts, Requests, TransactionSigned, EMPTY_OMMER_ROOT_HASH, U256 + constants::{eip4844::MAX_DATA_GAS_PER_BLOCK, BEACON_NONCE}, eip4844::calculate_excess_blob_gas, proofs::{self, calculate_requests_root}, Block, BlockNumber, ChainId, EthereumHardforks, Header, Receipt, Receipts, Requests, StateDiff, StateDiffAccount, StateDiffStorageSlot, TransactionSigned, B256, EMPTY_OMMER_ROOT_HASH, U256 }; //use reth_provider::{StateProvider, StateProviderFactory}; //use reth_revm::database::{StateProviderDatabase, SyncStateProviderDatabase}; @@ -34,6 +33,8 @@ pub fn to_state_diff(bundle_state: &BundleState, receipts: &Vec) -> Sta let mut state_diff = StateDiff { accounts: Vec::new(), receipts: receipts.clone(), + gas_used: 0, + transactions_root: B256::ZERO, }; for (address, bundle_account) in bundle_state.state.iter() { let storage = bundle_account.storage.iter().map(|(&key, value)| StateDiffStorageSlot { diff --git a/crates/gwyneth/src/builder.rs b/crates/gwyneth/src/builder.rs index c184451e3f8c..bb6fb807f7d9 100644 --- a/crates/gwyneth/src/builder.rs +++ b/crates/gwyneth/src/builder.rs @@ -27,8 +27,7 @@ use reth_payload_builder::{ EthBuiltPayload, }; use reth_primitives::{ - StateDiff, StateDiffAccount, StateDiffStorageSlot, - constants::{eip4844::MAX_DATA_GAS_PER_BLOCK, BEACON_NONCE}, eip4844::calculate_excess_blob_gas, proofs::{self, calculate_requests_root}, Block, BlockNumber, ChainId, EthereumHardforks, Header, Receipt, Receipts, Requests, TransactionSigned, EMPTY_OMMER_ROOT_HASH, U256 + constants::{eip4844::MAX_DATA_GAS_PER_BLOCK, BEACON_NONCE}, eip4844::calculate_excess_blob_gas, hex, proofs::{self, calculate_requests_root}, Block, BlockNumber, ChainId, EthereumHardforks, Header, Receipt, Receipts, Requests, StateDiff, StateDiffAccount, StateDiffStorageSlot, TransactionSigned, Withdrawals, B256, EMPTY_OMMER_ROOT_HASH, U256 }; use reth_provider::{StateProvider, StateProviderFactory}; use reth_revm::database::{StateProviderDatabase, SyncStateProviderDatabase}; @@ -153,8 +152,6 @@ where PayloadBuilderError::Internal(err.into()) })?; - println!("Build 6"); - let mut receipts = Vec::new(); for tx in &attributes.transactions { // // ensure we still have capacity for this transaction @@ -257,7 +254,7 @@ where executed_txs.push(tx.into_signed()); } - println!("{} - Build 7: {:?}", chain_spec.chain().id(), executed_txs); + //println!("{} - Build: {:?}", chain_spec.chain().id(), executed_txs); // check if we have a better block // if !is_better_payload(best_payload.as_ref(), total_fees) { @@ -268,34 +265,6 @@ where // }) //} - // calculate the requests and the requests root - let (requests, requests_root) = if chain_spec - .is_prague_active_at_timestamp(attributes.inner.timestamp) - { - let deposit_requests = parse_deposits_from_receipts(&chain_spec, receipts.iter().flatten()) - .map_err(|err| PayloadBuilderError::Internal(RethError::Execution(err.into())))?; - let withdrawal_requests = post_block_withdrawal_requests_contract_call( - &evm_config, - &mut sync_db, - &initialized_cfg, - &initialized_block_env, - ) - .map_err(|err| PayloadBuilderError::Internal(err.into()))?; - - let requests = [deposit_requests, withdrawal_requests].concat(); - let requests_root = calculate_requests_root(&requests); - (Some(requests.into()), Some(requests_root)) - } else { - (None, None) - }; - - let WithdrawalsOutcome { withdrawals_root, withdrawals } = commit_withdrawals( - &mut sync_db, - &chain_spec, - attributes.inner.timestamp, - attributes.inner.withdrawals, - )?; - // merge all transitions into bundle state, this would apply the withdrawal balance changes // and 4788 contract call sync_db.merge_transitions(BundleRetention::PlainState); @@ -305,13 +274,10 @@ where sync_db.take_bundle(), vec![receipts].into(), block_number, - vec![requests.clone().unwrap_or_default()], + vec![Requests::default()], ) .filter_current_chain(); - println!("coinbase: {:?}", initialized_block_env.coinbase); - println!("basefee: {:?}", base_fee); - let state_diff = execution_outcome_to_state_diff(&execution_outcome); let receipts_root = @@ -329,31 +295,6 @@ where // create the block header let transactions_root = proofs::calculate_transaction_root(&executed_txs); - // initialize empty blob sidecars at first. If cancun is active then this will - let mut blob_sidecars = Vec::new(); - let mut excess_blob_gas = None; - let mut blob_gas_used = None; - - // only determine cancun fields when active - if chain_spec.is_cancun_active_at_timestamp(attributes.inner.timestamp) { - // grab the blob sidecars from the executed txs - blob_sidecars = pool.get_all_blobs_exact( - executed_txs.iter().filter(|tx| tx.is_eip4844()).map(|tx| tx.hash).collect(), - )?; - - excess_blob_gas = if chain_spec.is_cancun_active_at_timestamp(parent_block.timestamp) { - let parent_excess_blob_gas = parent_block.excess_blob_gas.unwrap_or_default(); - let parent_blob_gas_used = parent_block.blob_gas_used.unwrap_or_default(); - Some(calculate_excess_blob_gas(parent_excess_blob_gas, parent_blob_gas_used)) - } else { - // for the first post-fork block, both parent.blob_gas_used and - // parent.excess_blob_gas are evaluated as 0 - Some(calculate_excess_blob_gas(0, 0)) - }; - - blob_gas_used = Some(sum_blob_gas_used); - } - let json_str = serde_json::to_string(&state_diff).unwrap(); let serialized_bytes = json_str.into_bytes(); let extra_data = Bytes::from(serialized_bytes); @@ -365,7 +306,7 @@ where state_root, transactions_root, receipts_root, - withdrawals_root, + withdrawals_root: Some(B256::from(hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"))), logs_bloom, timestamp: attributes.inner.timestamp, mix_hash: attributes.inner.prev_randao, @@ -377,15 +318,15 @@ where gas_used: cumulative_gas_used, extra_data, parent_beacon_block_root: attributes.inner.parent_beacon_block_root, - blob_gas_used, - excess_blob_gas, - requests_root, + blob_gas_used: Some(0), + excess_blob_gas: Some(0), + requests_root: Some(calculate_requests_root(&Vec::new())), }; println!("header: {:?}", header); // seal the block - let block = Block { header, body: executed_txs, ommers: vec![], withdrawals, requests }; + let block = Block { header, body: executed_txs, ommers: vec![], withdrawals: Some(Withdrawals::default()), requests: Some(Requests::default()) }; let sealed_block = block.seal_slow(); //sealed_block.state_diff = Some(execution_outcome_to_state_diff(&execution_outcome)); @@ -394,18 +335,13 @@ where println!("execution outcome: {:?}", execution_outcome); - assert_eq!(state_diff, attributes.state_diff.unwrap()); + assert_eq!(state_diff, attributes.chain_da.state_diff.unwrap()); debug!(target: "payload_builder", ?sealed_block, "sealed built block"); total_fees = U256::from(1u64); - let mut payload = EthBuiltPayload::new(attributes.inner.id, sealed_block, total_fees); - - // extend the payload with the blob sidecars from the executed txs - payload.extend_sidecars(blob_sidecars); - - println!("Build 18"); + let payload = EthBuiltPayload::new(attributes.inner.id, sealed_block, total_fees); Ok(BuildOutcome::Better { payload, cached_reads: /*sync_cached_reads.into())*/ CachedReads::default() }) } diff --git a/crates/gwyneth/src/exex.rs b/crates/gwyneth/src/exex.rs index 6130f59f058c..b3e1eda5aa26 100644 --- a/crates/gwyneth/src/exex.rs +++ b/crates/gwyneth/src/exex.rs @@ -18,7 +18,7 @@ use reth_node_builder::{components::Components, FullNode, Node, NodeAdapter}; use reth_node_ethereum::{node::EthereumAddOns, EthExecutorProvider}; use reth_payload_builder::EthBuiltPayload; use reth_primitives::{ - address, Address, SealedBlock, SealedBlockWithSenders, StateDiff, TransactionSigned, B256, U256 + address, Address, ChainDA, GwynethDA, SealedBlock, SealedBlockWithSenders, StateDiff, TransactionSigned, B256, U256 }; use reth_provider::{ providers::BlockchainProvider, BlockNumReader, CanonStateSubscriptions, DatabaseProviderFactory, @@ -133,16 +133,16 @@ impl Rollup { let transactions: Vec = decode_transactions(&meta.txList); println!("transactions: {:?}", transactions); - let state_diffs: HashMap = bincode::deserialize(&meta.stateDiffs.to_vec()).unwrap_or_else(|err| { - panic!("State diff can't be decoded: {}", err); + let da: GwynethDA = bincode::deserialize(&meta.stateDiffs.to_vec()).unwrap_or_else(|err| { + panic!("DA can't be decoded: {}", err); }); - println!("state_diffs: {:?}", state_diffs); + println!("da: {:?}", da); let all_transactions: Vec = decode_transactions(&meta.txList); let node_chain_id = BASE_CHAIN_ID + (node_idx as u64); - let state_diff = state_diffs.get(&node_chain_id); - println!("state_diff: {:?}", state_diff); + let chain_da = da.chain_das.get(&node_chain_id).unwrap(); + println!("chain_da: {:?}", chain_da); // let filtered_transactions: Vec = all_transactions // .into_iter() @@ -159,13 +159,13 @@ impl Rollup { let attrs = GwynethPayloadAttributes { inner: EthPayloadAttributes { timestamp: block.timestamp/* + node_idx as u64*/, - prev_randao: B256::ZERO, + prev_randao: block.mix_hash, suggested_fee_recipient: meta.coinbase, withdrawals: Some(vec![]), parent_beacon_block_root: block.parent_beacon_block_root, }, transactions: Some(filtered_transactions.clone()), - state_diff: state_diff.map(|s| s.clone()), + chain_da: chain_da.clone(), gas_limit: None, }; @@ -251,7 +251,7 @@ impl Rollup { ) .await?; - assert_eq!(block_hash, meta.blockHash, "unexpected block hash"); + assert_eq!(block_hash, chain_da.block_hash, "unexpected block hash"); // trigger forkchoice update via engine api to commit the block to the blockchain self.engine_apis[node_idx].update_forkchoice(block_hash, block_hash).await?; diff --git a/crates/gwyneth/src/lib.rs b/crates/gwyneth/src/lib.rs index adc3e4f84248..3b427695f7da 100644 --- a/crates/gwyneth/src/lib.rs +++ b/crates/gwyneth/src/lib.rs @@ -3,7 +3,7 @@ use std::{collections::HashMap, fmt::Debug, sync::Arc}; use builder::default_gwyneth_payload_builder; use reth_evm_ethereum::EthEvmConfig; -use reth_primitives::{ChainId, StateDiff}; +use reth_primitives::{ChainDA, ChainId, StateDiff}; use reth_tasks::TaskManager; use thiserror::Error; @@ -68,8 +68,7 @@ pub struct GwynethPayloadAttributes { #[serde(skip_serializing_if = "Option::is_none")] pub transactions: Option>, /// Transactions is a field for rollups: the transactions list is forced into the block - #[serde(skip_serializing_if = "Option::is_none")] - pub state_diff: Option, + pub chain_da: ChainDA, /// If set, this sets the exact gas limit the block produced with. #[serde(skip_serializing_if = "Option::is_none", with = "alloy_serde::quantity::opt")] pub gas_limit: Option, @@ -113,8 +112,8 @@ pub struct GwynethPayloadBuilderAttributes { /// Decoded transactions and the original EIP-2718 encoded bytes as received in the payload /// attributes. pub transactions: Vec>, - /// state diff - pub state_diff: Option, + /// chain DA + pub chain_da: ChainDA, /// The gas limit for the generated payload pub gas_limit: Option, @@ -141,7 +140,7 @@ impl PayloadBuilderAttributes Ok(Self { inner: EthPayloadBuilderAttributes::new(parent, attributes.inner), transactions, - state_diff: attributes.state_diff, + chain_da: attributes.chain_da, gas_limit: attributes.gas_limit, providers: HashMap::default(), }) diff --git a/crates/primitives/src/block.rs b/crates/primitives/src/block.rs index b458832aeb44..3b053dc71991 100644 --- a/crates/primitives/src/block.rs +++ b/crates/primitives/src/block.rs @@ -14,6 +14,7 @@ use reth_primitives_traits::Requests; use revm_primitives::AccountInfo; use serde::{Deserialize, Serialize}; use revm::db::states::BundleState; +use std::collections::HashMap; #[cfg(not(feature = "std"))] use alloc::vec::Vec; @@ -298,9 +299,46 @@ pub struct SealedBlock { pub requests: Option, } -/// Sealed Ethereum full block. -/// -/// Withdrawals can be optionally included at the end of the RLP encoded message. +/// GwynethDA +#[derive( + Debug, + Clone, + PartialEq, + Eq, + Default, + Serialize, + Deserialize, +)] +pub struct GwynethDA { + /// The DA per chain + pub chain_das: HashMap, + /// The transactions of the block for all chains + pub transactions: Option, + /// Extra data + pub extra_data: Bytes, +} +/// ChainDA +#[derive( + Debug, + Clone, + PartialEq, + Eq, + Default, + Serialize, + Deserialize, +)] +pub struct ChainDA { + /// Block hash (for debugging purposes really) + pub block_hash: B256, + /// Extra data + pub extra_data: Bytes, + /// State diff + pub state_diff: Option, + /// Transactions + pub transactions: Option, +} + +/// StateDiff #[derive( Debug, Clone, @@ -317,6 +355,10 @@ pub struct StateDiff { pub accounts: Vec, /// Receipts pub receipts: Vec, + /// Transactions root + pub transactions_root: B256, + /// Gas used + pub gas_used: u64, } /// StateDiffAccount diff --git a/crates/primitives/src/lib.rs b/crates/primitives/src/lib.rs index 37ca30023b4c..d080f91b635d 100644 --- a/crates/primitives/src/lib.rs +++ b/crates/primitives/src/lib.rs @@ -40,7 +40,7 @@ pub mod transaction; pub use block::{generate_valid_header, valid_header_strategy}; pub use block::{ Block, BlockBody, BlockHashOrNumber, BlockId, BlockNumHash, BlockNumberOrTag, BlockWithSenders, - ForkBlock, RpcBlockHash, SealedBlock, SealedBlockWithSenders, StateDiff, StateDiffAccount, StateDiffStorageSlot, + ForkBlock, RpcBlockHash, SealedBlock, SealedBlockWithSenders, GwynethDA, ChainDA, StateDiff, StateDiffAccount, StateDiffStorageSlot, }; #[cfg(feature = "reth-codec")] pub use compression::*; From d7459b4d49ecd5b16b64cd33fdf2deaafed7b14c Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Mon, 6 Jan 2025 19:29:22 +0100 Subject: [PATCH 19/24] add state root to StateDiff --- crates/evm/execution-types/src/state_diff.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/evm/execution-types/src/state_diff.rs b/crates/evm/execution-types/src/state_diff.rs index 689557075799..68368a05c09d 100644 --- a/crates/evm/execution-types/src/state_diff.rs +++ b/crates/evm/execution-types/src/state_diff.rs @@ -19,21 +19,22 @@ use revm::db::states::StorageSlot; use crate::{BlockExecutionOutput, ExecutionOutcome}; -pub fn execution_outcome_to_state_diff(execution_outcome: &ExecutionOutcome) -> StateDiff { +pub fn execution_outcome_to_state_diff(execution_outcome: &ExecutionOutcome, state_root: B256) -> StateDiff { assert_eq!(execution_outcome.receipts().len(), 1); let receipts = execution_outcome.receipts()[0].iter().map(|r| r.clone().unwrap()).collect(); - to_state_diff(&execution_outcome.bundle, &receipts) + to_state_diff(&execution_outcome.bundle, &receipts, state_root) } -pub fn block_execution_output_to_state_diff(block_execution_output: &BlockExecutionOutput) -> StateDiff { - to_state_diff(&block_execution_output.state, &block_execution_output.receipts) +pub fn block_execution_output_to_state_diff(block_execution_output: &BlockExecutionOutput, state_root: B256) -> StateDiff { + to_state_diff(&block_execution_output.state, &block_execution_output.receipts, state_root) } -pub fn to_state_diff(bundle_state: &BundleState, receipts: &Vec) -> StateDiff { +pub fn to_state_diff(bundle_state: &BundleState, receipts: &Vec, state_root: B256) -> StateDiff { let mut state_diff = StateDiff { accounts: Vec::new(), receipts: receipts.clone(), gas_used: 0, + state_root, transactions_root: B256::ZERO, }; for (address, bundle_account) in bundle_state.state.iter() { From b69ed4c157ca6b383240ff05d2ad9eab485d3fc3 Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Mon, 6 Jan 2025 19:32:34 +0100 Subject: [PATCH 20/24] add state root to StateDiff (again) --- crates/primitives/src/block.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/primitives/src/block.rs b/crates/primitives/src/block.rs index 3b053dc71991..01e64210be9b 100644 --- a/crates/primitives/src/block.rs +++ b/crates/primitives/src/block.rs @@ -355,6 +355,8 @@ pub struct StateDiff { pub accounts: Vec, /// Receipts pub receipts: Vec, + /// State root + pub state_root: B256, /// Transactions root pub transactions_root: B256, /// Gas used From 3de43c039eb523973feff430580a1f0da20bbb7f Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Mon, 6 Jan 2025 22:15:51 +0100 Subject: [PATCH 21/24] fix compile error --- crates/gwyneth/src/builder.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/gwyneth/src/builder.rs b/crates/gwyneth/src/builder.rs index bb6fb807f7d9..cc176dea09a1 100644 --- a/crates/gwyneth/src/builder.rs +++ b/crates/gwyneth/src/builder.rs @@ -278,8 +278,6 @@ where ) .filter_current_chain(); - let state_diff = execution_outcome_to_state_diff(&execution_outcome); - let receipts_root = execution_outcome.receipts_root_slow(block_number).expect("Number is in range"); let logs_bloom = execution_outcome.block_logs_bloom(block_number).expect("Number is in range"); @@ -292,6 +290,7 @@ where )? }; + let state_diff = execution_outcome_to_state_diff(&execution_outcome, state_root); // create the block header let transactions_root = proofs::calculate_transaction_root(&executed_txs); From edffe3e7edf90ff61be827db7a657b3e8e613e0f Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Tue, 7 Jan 2025 19:50:11 +0100 Subject: [PATCH 22/24] Added bundle directly to StateDiff --- crates/evm/execution-types/src/state_diff.rs | 14 +++++++------- crates/primitives/Cargo.toml | 4 ++-- crates/primitives/src/block.rs | 9 ++------- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/crates/evm/execution-types/src/state_diff.rs b/crates/evm/execution-types/src/state_diff.rs index 68368a05c09d..981f4e4dc3ce 100644 --- a/crates/evm/execution-types/src/state_diff.rs +++ b/crates/evm/execution-types/src/state_diff.rs @@ -19,23 +19,24 @@ use revm::db::states::StorageSlot; use crate::{BlockExecutionOutput, ExecutionOutcome}; -pub fn execution_outcome_to_state_diff(execution_outcome: &ExecutionOutcome, state_root: B256) -> StateDiff { +pub fn execution_outcome_to_state_diff(execution_outcome: &ExecutionOutcome, state_root: B256, gas_used: u64) -> StateDiff { assert_eq!(execution_outcome.receipts().len(), 1); let receipts = execution_outcome.receipts()[0].iter().map(|r| r.clone().unwrap()).collect(); - to_state_diff(&execution_outcome.bundle, &receipts, state_root) + to_state_diff(&execution_outcome.bundle, &receipts, state_root, gas_used) } pub fn block_execution_output_to_state_diff(block_execution_output: &BlockExecutionOutput, state_root: B256) -> StateDiff { - to_state_diff(&block_execution_output.state, &block_execution_output.receipts, state_root) + to_state_diff(&block_execution_output.state, &block_execution_output.receipts, state_root, block_execution_output.gas_used) } -pub fn to_state_diff(bundle_state: &BundleState, receipts: &Vec, state_root: B256) -> StateDiff { +pub fn to_state_diff(bundle_state: &BundleState, receipts: &Vec, state_root: B256, gas_used: u64) -> StateDiff { let mut state_diff = StateDiff { accounts: Vec::new(), receipts: receipts.clone(), - gas_used: 0, + gas_used, state_root, transactions_root: B256::ZERO, + bundle: bundle_state.clone(), }; for (address, bundle_account) in bundle_state.state.iter() { let storage = bundle_account.storage.iter().map(|(&key, value)| StateDiffStorageSlot { @@ -61,10 +62,9 @@ pub fn state_diff_to_block_execution_output(chain_id: u64, state_diff: &StateDif state: BundleState::default(), receipts: state_diff.receipts.clone(), requests: Vec::new(), - gas_used: 0, + gas_used: state_diff.gas_used, }; for account in state_diff.accounts.iter() { - let mut new_account = BundleAccount { info: Some(AccountInfo { balance: account.balance, diff --git a/crates/primitives/Cargo.toml b/crates/primitives/Cargo.toml index 2bb6bfbcd2f2..19f80a28cdfb 100644 --- a/crates/primitives/Cargo.toml +++ b/crates/primitives/Cargo.toml @@ -32,7 +32,8 @@ alloy-eips = { workspace = true, features = ["serde"] } alloy-consensus.workspace = true # revm -revm.workspace = true +revm = { workspace = true, features = ["serde"] } +#revm.workspace = true # optimism op-alloy-rpc-types = { workspace = true, optional = true } @@ -121,4 +122,3 @@ harness = false name = "validate_blob_tx" required-features = ["arbitrary", "c-kzg"] harness = false - diff --git a/crates/primitives/src/block.rs b/crates/primitives/src/block.rs index 01e64210be9b..98c38d7b9a17 100644 --- a/crates/primitives/src/block.rs +++ b/crates/primitives/src/block.rs @@ -347,8 +347,6 @@ pub struct ChainDA { Default, Serialize, Deserialize, - RlpEncodable, - RlpDecodable, )] pub struct StateDiff { /// Account state. @@ -361,6 +359,8 @@ pub struct StateDiff { pub transactions_root: B256, /// Gas used pub gas_used: u64, + /// full bundle state + pub bundle: BundleState, } /// StateDiffAccount @@ -372,10 +372,7 @@ pub struct StateDiff { Default, Serialize, Deserialize, - RlpEncodable, - RlpDecodable, )] -#[rlp(trailing)] pub struct StateDiffAccount { /// The address of the account pub address: Address, @@ -402,8 +399,6 @@ pub struct StateDiffAccount { Default, Serialize, Deserialize, - RlpEncodable, - RlpDecodable, )] pub struct StateDiffStorageSlot { /// Storage slot key From 1b8dd7803a8ea373940c5a62ea9b52e5e8eef5be Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Tue, 7 Jan 2025 19:52:50 +0100 Subject: [PATCH 23/24] fix compile error --- crates/gwyneth/src/builder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/gwyneth/src/builder.rs b/crates/gwyneth/src/builder.rs index cc176dea09a1..530bc5e7da62 100644 --- a/crates/gwyneth/src/builder.rs +++ b/crates/gwyneth/src/builder.rs @@ -290,7 +290,7 @@ where )? }; - let state_diff = execution_outcome_to_state_diff(&execution_outcome, state_root); + let state_diff = execution_outcome_to_state_diff(&execution_outcome, state_root, cumulative_gas_used); // create the block header let transactions_root = proofs::calculate_transaction_root(&executed_txs); From 8c0ab006ca8c02082edb19be2f19f9ed17ac27bb Mon Sep 17 00:00:00 2001 From: Brecht Devos Date: Sat, 11 Jan 2025 02:26:35 +0100 Subject: [PATCH 24/24] sync composability + state delta's --- Cargo.lock | 9 +- crates/blockchain-tree/Cargo.toml | 1 + crates/blockchain-tree/src/chain.rs | 501 +++++++++++++----- crates/gwyneth/src/builder.rs | 354 +++++++------ crates/gwyneth/src/engine_api.rs | 3 +- crates/gwyneth/src/exex.rs | 48 +- crates/payload/validator/src/lib.rs | 5 +- .../src/providers/database/provider.rs | 18 +- crates/storage/provider/src/writer/mod.rs | 4 + packages/protocol/contracts/L1/TaikoL1.sol | 7 +- .../protocol/contracts/examples/xERC20.sol | 12 + .../check_xchain_balances.py | 18 +- .../protocol/scripts/deploy_and_xtransfer.sh | 7 +- packages/protocol/scripts/xTransfer.s.sol | 10 +- packages/protocol/scripts/xWithdraw.s.sol | 42 ++ 15 files changed, 720 insertions(+), 319 deletions(-) create mode 100644 packages/protocol/scripts/xWithdraw.s.sol diff --git a/Cargo.lock b/Cargo.lock index 0757cfb0a098..dbdbf1643067 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6521,6 +6521,7 @@ dependencies = [ "alloy-genesis", "aquamarine", "assert_matches", + "bincode", "linked_hash_set", "metrics 0.23.0", "parking_lot 0.12.3", @@ -9036,7 +9037,7 @@ dependencies = [ [[package]] name = "revm" version = "14.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#f74ba0aeceafaea49a07bf2bf56d425da8e1f48b" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#6f16de431c7389ae21c3d3e15c3779f26a890815" dependencies = [ "auto_impl", "cfg-if", @@ -9068,7 +9069,7 @@ dependencies = [ [[package]] name = "revm-interpreter" version = "10.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#f74ba0aeceafaea49a07bf2bf56d425da8e1f48b" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#6f16de431c7389ae21c3d3e15c3779f26a890815" dependencies = [ "revm-primitives", "serde", @@ -9077,7 +9078,7 @@ dependencies = [ [[package]] name = "revm-precompile" version = "11.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#f74ba0aeceafaea49a07bf2bf56d425da8e1f48b" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#6f16de431c7389ae21c3d3e15c3779f26a890815" dependencies = [ "aurora-engine-modexp", "blst", @@ -9096,7 +9097,7 @@ dependencies = [ [[package]] name = "revm-primitives" version = "9.0.1" -source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#f74ba0aeceafaea49a07bf2bf56d425da8e1f48b" +source = "git+https://github.com/taikoxyz/revm.git?branch=gwyneth-debug-shit#6f16de431c7389ae21c3d3e15c3779f26a890815" dependencies = [ "alloy-eips", "alloy-primitives 0.8.14", diff --git a/crates/blockchain-tree/Cargo.toml b/crates/blockchain-tree/Cargo.toml index 4044675cb060..43c190430b2e 100644 --- a/crates/blockchain-tree/Cargo.toml +++ b/crates/blockchain-tree/Cargo.toml @@ -44,6 +44,7 @@ aquamarine.workspace = true linked_hash_set.workspace = true serde.workspace = true serde_json.workspace = true +bincode.workspace = true [dev-dependencies] reth-chainspec.workspace = true diff --git a/crates/blockchain-tree/src/chain.rs b/crates/blockchain-tree/src/chain.rs index de7392d71fea..f762c58091a9 100644 --- a/crates/blockchain-tree/src/chain.rs +++ b/crates/blockchain-tree/src/chain.rs @@ -15,10 +15,10 @@ use reth_evm::execute::{BlockExecutorProvider, Executor}; use reth_execution_errors::BlockExecutionError; use reth_execution_types::{Chain, ExecutionOutcome}; use reth_primitives::{ - BlockHash, BlockNumber, ForkBlock, GotExpected, SealedBlockWithSenders, SealedHeader, U256, + BlockHash, BlockNumber, ForkBlock, GotExpected, SealedBlockWithSenders, SealedHeader, B256, U256 }; use reth_provider::{ - providers::{BundleStateProvider, ConsistentDbView}, BlockNumReader, ChainSpecProvider, DatabaseProviderFactory, FullExecutionDataProvider, ProviderError, StateProvider, StateRootProvider, NODES + providers::{BundleStateProvider, ConsistentDbView}, AccountReader, BlockNumReader, ChainSpecProvider, DatabaseProviderFactory, FullExecutionDataProvider, ProviderError, StateProvider, StateRootProvider, NODES }; use reth_revm::database::{StateProviderDatabase, SyncStateProviderDatabase}; use reth_trie::{updates::TrieUpdates, HashedPostState}; @@ -172,6 +172,275 @@ impl AppendableChain { /// - [`BlockAttachment`] represents if the block extends the canonical chain, and thus we can /// cache the trie state updates. /// - [`BlockValidationKind`] determines if the state root __should__ be validated. + // fn validate_and_execute( + // block: SealedBlockWithSenders, + // parent_block: &SealedHeader, + // bundle_state_data_provider: EDP, + // externals: &TreeExternals, + // block_attachment: BlockAttachment, + // block_validation_kind: BlockValidationKind, + // ) -> Result<(ExecutionOutcome, Option), BlockExecutionError> + // where + // EDP: FullExecutionDataProvider, + // DB: Database + Clone, + // E: BlockExecutorProvider, + // { + // // some checks are done before blocks comes here. + // externals.consensus.validate_header_against_parent(&block, parent_block)?; + + // // get the state provider. + // let canonical_fork = bundle_state_data_provider.canonical_fork(); + + // // SAFETY: For block execution and parallel state root computation below we open multiple + // // independent database transactions. Upon opening the database transaction the consistent + // // view will check a current tip in the database and throw an error if it doesn't match + // // the one recorded during initialization. + // // It is safe to use consistent view without any special error handling as long as + // // we guarantee that plain state cannot change during processing of new payload. + // // The usage has to be re-evaluated if that was ever to change. + // let consistent_view = + // ConsistentDbView::new_with_latest_tip(externals.provider_factory.clone())?; + // let state_provider = consistent_view + // .provider_ro()? + // // State root calculation can take a while, and we're sure no write transaction + // // will be open in parallel. See https://github.com/paradigmxyz/reth/issues/7509. + // .disable_long_read_transaction_safety() + // .state_provider_by_block_number(canonical_fork.number)?; + + + // // // Brecht + // // let mut super_db = SyncStateProviderDatabase::new( + // // Some(externals.provider_factory.chain_spec().chain.id()), + // // StateProviderDatabase::new(&provider), + // // ); + + // // // Add all external state dependencies + // // let providers = NODES.lock().unwrap(); + // // let mut chain_providers = Vec::new(); + // // for (&chain_id, chain_provider) in providers.iter() { + // // println!("Adding db for chain_id: {}", chain_id); + + // // let state_provider = chain_provider + // // .database_provider_ro() + // // .unwrap(); + // // let last_block_number = state_provider.last_block_number()?; + // // let state_provider = state_provider.state_provider_by_block_number(last_block_number).unwrap(); + + // // let chain_provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); + // // chain_providers.push(chain_provider); + + // // //let boxed: Box = Box::new(state_provider); + // // //let state_provider = StateProviderDatabase::new(boxed); + // // super_db.add_db(chain_id, StateProviderDatabase::new(&chain_providers.last().unwrap())); + // // } + + // // Brecht + // // let mut super_db: SyncStateProviderDatabase> = SyncStateProviderDatabase::new( + // // Some(externals.provider_factory.chain_spec().chain.id()), + // // StateProviderDatabase::new(state_provider), + // // ); + + // // println!("Brecht executed: Adding db for chain_id: {}", externals.provider_factory.chain_spec().chain.id()); + // // // Add all external state dependencies + // // let providers = NODES.lock().unwrap(); + // // //let mut chain_providers = Vec::new(); + // // for (&chain_id, chain_provider) in providers.iter() { + // // if chain_id == externals.provider_factory.chain_spec().chain.id() { + // // continue; + // // } + // // println!("Brecht executed: Adding db for chain_id: {}", chain_id); + + // // let state_provider = chain_provider + // // .database_provider_ro() + // // .unwrap(); + // // //let last_block_number = state_provider.last_block_number()?; + // // let last_block_number = block.number - 1; + // // println!("[{}-{}] Executing against block {} {}", externals.provider_factory.chain_spec().chain.id(), block.number, chain_id, last_block_number); + // // let state_provider = state_provider.state_provider_by_block_number(last_block_number).unwrap(); + + // // //let chain_provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); + // // //chain_providers.push(chain_provider); + + // // //let boxed: Box = Box::new(state_provider); + // // //let state_provider = StateProviderDatabase::new(boxed); + // // super_db.add_db(chain_id, StateProviderDatabase::new(state_provider)); + // // } + + // let block_number = block.number; + // let block_hash = block.hash(); + + // //println!("Block extra data: {:?}", block.extra_data); + // let state_diff = if block.extra_data.len() > 32 { + // //let json_str = String::from_utf8(block.extra_data.to_vec()).unwrap(); + // //let state_diff = serde_json::from_str(&json_str).unwrap_or(None); + // //let state_diff: Option = serde_json::from_str(&json_str).unwrap_or(None); + // Some(bincode::deserialize(&block.extra_data.to_vec()).unwrap()) + // } else { + // None + // }; + + // println!("Applying block update: {:?}", state_diff); + + // let chain_id = externals.provider_factory.chain_spec().chain.id(); + + // let initial_execution_outcome = if let Some(state_diff) = &state_diff { + // println!("[{}] Applying state from diff", chain_id); + + // // let block = block.clone().unseal(); + // // let executor = externals.executor_factory.executor(super_db); + // // let state_execution = executor.execute((&block, U256::MAX).into())?; + + // let mut state_execution_diff = state_diff_to_block_execution_output(chain_id, state_diff); + // state_execution_diff.state = state_diff.bundle.clone(); + // state_execution_diff.receipts = state_diff.receipts.clone(); + + // for (tx, receipt) in block.transactions().zip(state_diff.receipts.iter()) { + // println!("{} [BBB] tx: {}: {:?}", chain_id, tx.hash(), receipt); + // } + + // //println!("ori: {:?}", state_execution); + // //println!("new: {:?}", state_execution_diff); + + // //let execution_outcome_execution = ExecutionOutcome::from((state_execution.clone(), chain_id, block_number)).filter_chain(chain_id); + // let execution_outcome_diff = ExecutionOutcome::from((state_execution_diff, chain_id, block_number)); + + + // //println!("ori: {:?}", execution_outcome_execution.bundle); + // println!("new: {:?}", execution_outcome_diff.bundle); + + // // for (address, account) in execution_outcome_diff.bundle.state.iter_mut() { + // // //let provider = consistent_view.provider_ro().unwrap(); + // // //let account = provider.basic_account(address) + // // //account.original_info = execution_outcome_execution.bundle.state.get(address).unwrap().original_info.clone(); + // // *account = execution_outcome_execution.bundle.state.get(address).unwrap().clone(); + // // } + + + // println!("new: {:?}", execution_outcome_diff.bundle); + + // // execution_outcome_diff.bundle = execution_outcome_execution.bundle.clone(); + + // // println!("ori: {:?}", execution_outcome_execution.bundle); + // // println!("new: {:?}", execution_outcome_diff.bundle); + + // //execution_outcome_diff.bundle.state = execution_outcome_execution.bundle.state.clone(); + // //execution_outcome_diff.bundle.contracts = execution_outcome_execution.bundle.contracts.clone(); + + // // execution_outcome_diff.bundle.state_size = execution_outcome_execution.bundle.state_size; + // // execution_outcome_diff.bundle.reverts_size = execution_outcome_execution.bundle.reverts_size; + // // execution_outcome_diff.bundle.reverts = execution_outcome_execution.bundle.reverts.clone(); + + // println!("new: {:?}", execution_outcome_diff); + + // //let hashed_state_execution = execution_outcome_execution.hash_state_slow(); + // let hashed_state_diff = execution_outcome_diff.hash_state_slow(); + // //assert_eq!(hashed_state_execution, hashed_state_diff, "state diff incorrect"); + + // //println!("ori: {:?}", hashed_state_execution); + // println!("new: {:?}", hashed_state_diff); + + // //execution_outcome_diff.bundle = state_diff.bundle.clone(); + + // execution_outcome_diff + // } else { + // let mut super_db: SyncStateProviderDatabase> = SyncStateProviderDatabase::new( + // Some(externals.provider_factory.chain_spec().chain.id()), + // StateProviderDatabase::new(state_provider), + // ); + // println!("Applying state from transactions"); + // let block = block.clone().unseal(); + // let executor = externals.executor_factory.executor(super_db); + // let state = executor.execute((&block, U256::MAX).into())?; + + // // externals.consensus.validate_block_post_execution( + // // &block, + // // PostExecutionInput::new(&state.receipts, &state.requests), + // // )?; + + // let initial_execution_outcome = ExecutionOutcome::from((state, chain_id, block_number)); + // let initial_execution_outcome = initial_execution_outcome.filter_chain(chain_id); + + // initial_execution_outcome + // }; + + // // SAFETY: For block execution and parallel state root computation below we open multiple + // // independent database transactions. Upon opening the database transaction the consistent + // // view will check a current tip in the database and throw an error if it doesn't match + // // the one recorded during initialization. + // // It is safe to use consistent view without any special error handling as long as + // // we guarantee that plain state cannot change during processing of new payload. + // // The usage has to be re-evaluated if that was ever to change. + // let consistent_view = + // ConsistentDbView::new_with_latest_tip(externals.provider_factory.clone())?; + // let state_provider = consistent_view + // .provider_ro()? + // // State root calculation can take a while, and we're sure no write transaction + // // will be open in parallel. See https://github.com/paradigmxyz/reth/issues/7509. + // .disable_long_read_transaction_safety() + // .state_provider_by_block_number(canonical_fork.number)?; + + // let provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); + + + // // check state root if the block extends the canonical chain __and__ if state root + // // validation was requested. + // if block_validation_kind.is_exhaustive() { + // // calculate and check state root + // let start = Instant::now(); + // let (state_root, trie_updates) = if block_attachment.is_canonical() { + // println!("canonical block"); + // // TODO(Cecilie): refactor the bundle state provider for cross-chain bundles + // //let mut execution_outcome = + // // provider.block_execution_data_provider.execution_outcome().clone(); + // //execution_outcome.chain_id = chain_id; + // //execution_outcome.extend(initial_execution_outcome.clone()); + // //let execution_outcome = initial_execution_outcome.clone(); + + // let mut execution_outcome = + // provider.block_execution_data_provider.execution_outcome().clone(); + // execution_outcome.extend(initial_execution_outcome.clone()); + // let hashed_state = execution_outcome.hash_state_slow(); + // ParallelStateRoot::new(consistent_view, hashed_state) + // .incremental_root_with_updates() + // .map(|(root, updates)| (root, Some(updates))) + // .map_err(ProviderError::from)? + + // // let hashed_state = execution_outcome.hash_state_slow(); + // // ParallelStateRoot::new(consistent_view, hashed_state) + // // .incremental_root_with_updates() + // // .map(|(root, updates)| (root, Some(updates))) + // // .map_err(ProviderError::from)? + // } else { + // let hashed_state = HashedPostState::from_bundle_state( + // &initial_execution_outcome.current_state().state, + // ); + // let state_root = provider.state_root(hashed_state)?; + // //let state_root = super_db.get(&externals.provider_factory.chain_spec().chain.id()).unwrap().state_root(hashed_state)?; + // (state_root, None) + // //println!("Skipping check for chain {}", chain_id); + // //(B256::ZERO, None) + // }; + // if block.state_root != state_root { + // return Err(ConsensusError::BodyStateRootDiff( + // GotExpected { got: state_root, expected: block.state_root }.into(), + // ) + // .into()) + // } + + // tracing::debug!( + // target: "blockchain_tree::chain", + // number = block.number, + // hash = %block_hash, + // elapsed = ?start.elapsed(), + // "Validated state root" + // ); + + // Ok((initial_execution_outcome, trie_updates)) + // } else { + // Ok((initial_execution_outcome, None)) + // } + // } + fn validate_and_execute( block: SealedBlockWithSenders, parent_block: &SealedHeader, @@ -207,161 +476,137 @@ impl AppendableChain { .disable_long_read_transaction_safety() .state_provider_by_block_number(canonical_fork.number)?; + let provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); + let chain_id = externals.provider_factory.chain_spec().chain.id(); - // let provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); + let db = SyncStateProviderDatabase::new( + Some(externals.provider_factory.chain_spec().chain.id()), + StateProviderDatabase::new(&provider), + ); - // // Brecht - // let mut super_db = SyncStateProviderDatabase::new( - // Some(externals.provider_factory.chain_spec().chain.id()), - // StateProviderDatabase::new(&provider), - // ); + let state_diff = if block.extra_data.len() > 32 { + //let json_str = String::from_utf8(block.extra_data.to_vec()).unwrap(); + //let state_diff = serde_json::from_str(&json_str).unwrap_or(None); + //let state_diff: Option = serde_json::from_str(&json_str).unwrap_or(None); + Some(bincode::deserialize(&block.extra_data.to_vec()).unwrap()) + } else { + None + }; + let initial_execution_outcome = if let Some(state_diff) = &state_diff { + println!("[{}] Applying state from diff", chain_id); - // // Add all external state dependencies - // let providers = NODES.lock().unwrap(); - // let mut chain_providers = Vec::new(); - // for (&chain_id, chain_provider) in providers.iter() { - // println!("Adding db for chain_id: {}", chain_id); + // let block = block.clone().unseal(); + // let executor = externals.executor_factory.executor(super_db); + // let state_execution = executor.execute((&block, U256::MAX).into())?; - // let state_provider = chain_provider - // .database_provider_ro() - // .unwrap(); - // let last_block_number = state_provider.last_block_number()?; - // let state_provider = state_provider.state_provider_by_block_number(last_block_number).unwrap(); + let mut state_execution_diff = state_diff_to_block_execution_output(chain_id, state_diff); + state_execution_diff.state = state_diff.bundle.clone(); + state_execution_diff.receipts = state_diff.receipts.clone(); - // let chain_provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); - // chain_providers.push(chain_provider); + for (tx, receipt) in block.transactions().zip(state_diff.receipts.iter()) { + println!("{} [BBB] tx: {}: {:?}", chain_id, tx.hash(), receipt); + } - // //let boxed: Box = Box::new(state_provider); - // //let state_provider = StateProviderDatabase::new(boxed); - // super_db.add_db(chain_id, StateProviderDatabase::new(&chain_providers.last().unwrap())); - // } + //println!("ori: {:?}", state_execution); + //println!("new: {:?}", state_execution_diff); - // Brecht - let mut super_db = SyncStateProviderDatabase::new( - Some(externals.provider_factory.chain_spec().chain.id()), - StateProviderDatabase::new(state_provider), - ); + //let execution_outcome_execution = ExecutionOutcome::from((state_execution.clone(), chain_id, block_number)).filter_chain(chain_id); + let execution_outcome_diff = ExecutionOutcome::from((state_execution_diff, chain_id, block.number)); - println!("Brecht executed: Adding db for chain_id: {}", externals.provider_factory.chain_spec().chain.id()); - // Add all external state dependencies - let providers = NODES.lock().unwrap(); - //let mut chain_providers = Vec::new(); - for (&chain_id, chain_provider) in providers.iter() { - if chain_id == externals.provider_factory.chain_spec().chain.id() { - continue; - } - println!("Brecht executed: Adding db for chain_id: {}", chain_id); - - let state_provider = chain_provider - .database_provider_ro() - .unwrap(); - //let last_block_number = state_provider.last_block_number()?; - let last_block_number = block.number - 1; - println!("[{}-{}] Executing against block {} {}", externals.provider_factory.chain_spec().chain.id(), block.number, chain_id, last_block_number); - let state_provider = state_provider.state_provider_by_block_number(last_block_number).unwrap(); - - //let chain_provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); - //chain_providers.push(chain_provider); - - //let boxed: Box = Box::new(state_provider); - //let state_provider = StateProviderDatabase::new(boxed); - super_db.add_db(chain_id, StateProviderDatabase::new(state_provider)); - } - let block_number = block.number; - let block_hash = block.hash(); + //println!("ori: {:?}", execution_outcome_execution.bundle); + //println!("new: {:?}", execution_outcome_diff.bundle); - println!("Block extra data: {:?}", block.extra_data); - let state_diff = if block.extra_data.len() > 32 { - println!("Decoding extra data..."); - let json_str = String::from_utf8(block.extra_data.to_vec()).unwrap(); - let state_diff = serde_json::from_str(&json_str).unwrap_or(None); - state_diff - } else { - None - }; + // for (address, account) in execution_outcome_diff.bundle.state.iter_mut() { + // //let provider = consistent_view.provider_ro().unwrap(); + // //let account = provider.basic_account(address) + // //account.original_info = execution_outcome_execution.bundle.state.get(address).unwrap().original_info.clone(); + // *account = execution_outcome_execution.bundle.state.get(address).unwrap().clone(); + // } - println!("Applying block update: {:?}", state_diff); - let chain_id = externals.provider_factory.chain_spec().chain.id(); + //println!("new: {:?}", execution_outcome_diff.bundle); + + // execution_outcome_diff.bundle = execution_outcome_execution.bundle.clone(); + + // println!("ori: {:?}", execution_outcome_execution.bundle); + // println!("new: {:?}", execution_outcome_diff.bundle); - let state = if let Some(state_diff) = &state_diff { - println!("Applying state from diff"); + //execution_outcome_diff.bundle.state = execution_outcome_execution.bundle.state.clone(); + //execution_outcome_diff.bundle.contracts = execution_outcome_execution.bundle.contracts.clone(); - let block = block.unseal(); - let executor = externals.executor_factory.executor(super_db); - let state_execution = executor.execute((&block, U256::MAX).into())?; + // execution_outcome_diff.bundle.state_size = execution_outcome_execution.bundle.state_size; + // execution_outcome_diff.bundle.reverts_size = execution_outcome_execution.bundle.reverts_size; + // execution_outcome_diff.bundle.reverts = execution_outcome_execution.bundle.reverts.clone(); - let state_diff = state_diff_to_block_execution_output(chain_id, state_diff); + println!("new: {:?}", execution_outcome_diff); - println!("ori: {:?}", state_execution); - println!("new: {:?}", state_diff); + //let hashed_state_execution = execution_outcome_execution.hash_state_slow(); + //let hashed_state_diff = execution_outcome_diff.hash_state_slow(); + //assert_eq!(hashed_state_execution, hashed_state_diff, "state diff incorrect"); - let execution_outcome_execution = ExecutionOutcome::from((state_execution.clone(), chain_id, block_number)).filter_chain(chain_id); - let execution_outcome_diff = ExecutionOutcome::from((state_diff, chain_id, block_number)).filter_chain(chain_id); + //println!("ori: {:?}", hashed_state_execution); + //println!("new: {:?}", hashed_state_diff); - let hashed_state_execution = execution_outcome_execution.hash_state_slow(); - let hashed_state_diff = execution_outcome_diff.hash_state_slow(); - assert_eq!(hashed_state_execution, hashed_state_diff, "state diff incorrect"); + //execution_outcome_diff.bundle = state_diff.bundle.clone(); - state_execution + execution_outcome_diff } else { - println!("Applying state from transactions"); - let block = block.unseal(); - let executor = externals.executor_factory.executor(super_db); + let executor = externals.executor_factory.executor(db); + let block = block.clone().unseal(); + let state = executor.execute((&block, U256::MAX).into())?; - state - // externals.consensus.validate_block_post_execution( - // &block, - // PostExecutionInput::new(&state.receipts, &state.requests), - // )?; - }; + externals.consensus.validate_block_post_execution( + &block, + PostExecutionInput::new(&state.receipts, &state.requests), + )?; - let initial_execution_outcome = ExecutionOutcome::from((state, chain_id, block_number)); - let initial_execution_outcome = initial_execution_outcome.filter_chain(chain_id); + let chain_id = externals.provider_factory.chain_spec().chain.id(); + ExecutionOutcome::from((state, chain_id, block.number)) + }; // check state root if the block extends the canonical chain __and__ if state root // validation was requested. - // if block_validation_kind.is_exhaustive() { + if block_validation_kind.is_exhaustive() { // calculate and check state root - // let start = Instant::now(); - // let (state_root, trie_updates) = if block_attachment.is_canonical() { - // // TODO(Cecilie): refactor the bundle state provider for cross-chain bundles - // let mut execution_outcome = - // provider.block_execution_data_provider.execution_outcome().clone(); - // execution_outcome.chain_id = chain_id; - // execution_outcome.extend(initial_execution_outcome.clone()); - // let hashed_state = execution_outcome.hash_state_slow(); - // ParallelStateRoot::new(consistent_view, hashed_state) - // .incremental_root_with_updates() - // .map(|(root, updates)| (root, Some(updates))) - // .map_err(ProviderError::from)? - // } else { - // let hashed_state = HashedPostState::from_bundle_state( - // &initial_execution_outcome.current_state().state, - // ); - // let state_root = provider.state_root(hashed_state)?; - // (state_root, None) - // }; - // if block.state_root != state_root { - // return Err(ConsensusError::BodyStateRootDiff( - // GotExpected { got: state_root, expected: block.state_root }.into(), - // ) - // .into()) - // } + let start = Instant::now(); + let (state_root, trie_updates) = if block_attachment.is_canonical() { + let mut execution_outcome = + provider.block_execution_data_provider.execution_outcome().clone(); + execution_outcome.chain_id = chain_id; + execution_outcome.extend(initial_execution_outcome.clone()); + let hashed_state = execution_outcome.hash_state_slow(); + ParallelStateRoot::new(consistent_view, hashed_state) + .incremental_root_with_updates() + .map(|(root, updates)| (root, Some(updates))) + .map_err(ProviderError::from)? + } else { + let hashed_state = HashedPostState::from_bundle_state( + &initial_execution_outcome.state(chain_id).state, + ); + let state_root = provider.state_root(hashed_state)?; + (state_root, None) + }; + assert_eq!(block.state_root, state_root, "state root mismatch"); + if block.state_root != state_root { + return Err(ConsensusError::BodyStateRootDiff( + GotExpected { got: state_root, expected: block.state_root }.into(), + ) + .into()) + } - // tracing::debug!( - // target: "blockchain_tree::chain", - // number = block.number, - // hash = %block_hash, - // elapsed = ?start.elapsed(), - // "Validated state root" - // ); + tracing::debug!( + target: "blockchain_tree::chain", + number = block.number, + hash = %block.hash(), + elapsed = ?start.elapsed(), + "Validated state root" + ); - // Ok((initial_execution_outcome, trie_updates)) - // } else { + Ok((initial_execution_outcome, trie_updates)) + } else { Ok((initial_execution_outcome, None)) - //} + } } /// Validate and execute the given block, and append it to this chain. diff --git a/crates/gwyneth/src/builder.rs b/crates/gwyneth/src/builder.rs index 530bc5e7da62..ca81dbc68156 100644 --- a/crates/gwyneth/src/builder.rs +++ b/crates/gwyneth/src/builder.rs @@ -29,7 +29,7 @@ use reth_payload_builder::{ use reth_primitives::{ constants::{eip4844::MAX_DATA_GAS_PER_BLOCK, BEACON_NONCE}, eip4844::calculate_excess_blob_gas, hex, proofs::{self, calculate_requests_root}, Block, BlockNumber, ChainId, EthereumHardforks, Header, Receipt, Receipts, Requests, StateDiff, StateDiffAccount, StateDiffStorageSlot, TransactionSigned, Withdrawals, B256, EMPTY_OMMER_ROOT_HASH, U256 }; -use reth_provider::{StateProvider, StateProviderFactory}; +use reth_provider::{state_diff_to_block_execution_output, StateProvider, StateProviderFactory}; use reth_revm::database::{StateProviderDatabase, SyncStateProviderDatabase}; use reth_transaction_pool::{BestTransactionsAttributes, TransactionPool}; use reth_trie::HashedPostState; @@ -82,7 +82,7 @@ where .. } = config; - println!("Build 1"); + println!("[{}] Build 1", chain_spec.chain().id()); let state_provider = client.state_by_block_hash(parent_block.hash())?; let state = StateProviderDatabase::new(state_provider); @@ -109,170 +109,181 @@ where initialized_block_env.gas_limit.try_into().unwrap_or(chain_spec.max_gas_limit); let base_fee = initialized_block_env.basefee.to::(); - let mut executed_txs: Vec = Vec::new(); + //let mut executed_txs: Vec = Vec::new(); - let mut best_txs = pool.best_transactions_with_attributes(BestTransactionsAttributes::new( - base_fee, - initialized_block_env.get_blob_gasprice().map(|gasprice| gasprice as u64), - )); + // let mut best_txs = pool.best_transactions_with_attributes(BestTransactionsAttributes::new( + // base_fee, + // initialized_block_env.get_blob_gasprice().map(|gasprice| gasprice as u64), + // )); let mut total_fees = U256::ZERO; let block_number = initialized_block_env.number.to::(); // apply eip-4788 pre block contract call - pre_block_beacon_root_contract_call( - &mut sync_db, - &evm_config, - &chain_spec, - &initialized_cfg, - &initialized_block_env, - attributes.inner.parent_beacon_block_root, - ) - .map_err(|err| { - warn!(target: "payload_builder", - parent_hash=%parent_block.hash(), - %err, - "failed to apply beacon root contract call for empty payload" - ); - PayloadBuilderError::Internal(err.into()) - })?; - - // apply eip-2935 blockhashes update - pre_block_blockhashes_contract_call( - &mut sync_db, - &evm_config, - &chain_spec, - &initialized_cfg, - &initialized_block_env, - parent_block.hash(), - ) - .map_err(|err| { - warn!(target: "payload_builder", parent_hash=%parent_block.hash(), %err, "failed to update blockhashes for empty payload"); - PayloadBuilderError::Internal(err.into()) - })?; - - let mut receipts = Vec::new(); - for tx in &attributes.transactions { - // // ensure we still have capacity for this transaction - // if cumulative_gas_used + tx.gas_limit() > block_gas_limit { - // // we can't fit this transaction into the block, so we need to mark it as invalid - // // which also removes all dependent transaction from the iterator before we can - // // continue - // best_txs.mark_invalid(&tx); - // continue - // } - - // Check if the job was cancelled, if so we can exit early. - if cancel.is_cancelled() { - return Ok(BuildOutcome::Cancelled) - } - - let tx = tx.clone().1.try_into_ecrecovered().unwrap(); - - // // There's only limited amount of blob space available per block, so we need to check if - // // the EIP-4844 can still fit in the block - // if let Some(blob_tx) = tx.transaction.as_eip4844() { - // let tx_blob_gas = blob_tx.blob_gas(); - // if sum_blob_gas_used + tx_blob_gas > MAX_DATA_GAS_PER_BLOCK { - // // we can't fit this _blob_ transaction into the block, so we mark it as - // // invalid, which removes its dependent transactions from - // // the iterator. This is similar to the gas limit condition - // // for regular transactions above. - // trace!(target: "payload_builder", tx=?tx.hash, ?sum_blob_gas_used, ?tx_blob_gas, - // "skipping blob transaction because it would exceed the max data gas per block"); - // best_txs.mark_invalid(&tx); - // continue - // } - // } - - let env = EnvWithHandlerCfg::new_with_cfg_env( - initialized_cfg.clone(), - initialized_block_env.clone(), - evm_config.tx_env(&tx), - ); - - // Configure the environment for the block. - let mut evm = evm_config.evm_with_env(&mut sync_db, env); - - let ResultAndState { result, state } = match evm.transact() { - Ok(res) => res, - Err(err) => { - match err { - EVMError::Transaction(err) => { - println!("build tx error: {:?}", err); - trace!(target: "payload_builder", %err, ?tx, "Error in sequencer transaction, skipping."); - continue - } - err => { - println!("build tx error fatal: {:?}", err); - // this is an error that we should treat as fatal for this attempt - //return Err(PayloadBuilderError::EvmExecutionError(err)) - continue - } - } - } - }; - // drop evm so db is released. - drop(evm); - // commit changes - sync_db.commit(state); - - // add to the total blob gas used if the transaction successfully executed - if let Some(blob_tx) = tx.transaction.as_eip4844() { - let tx_blob_gas = blob_tx.blob_gas(); - sum_blob_gas_used += tx_blob_gas; - - // if we've reached the max data gas per block, we can skip blob txs entirely - if sum_blob_gas_used == MAX_DATA_GAS_PER_BLOCK { - best_txs.skip_blobs(); - } - } - - let gas_used = result.gas_used(); - - // add gas used by the transaction to cumulative gas used, before creating the receipt - cumulative_gas_used += gas_used; - - // Push transaction changeset and calculate header bloom filter for receipt. - #[allow(clippy::needless_update)] // side-effect of optimism fields - receipts.push(Some(Receipt { - tx_type: tx.tx_type(), - success: result.is_success(), - cumulative_gas_used, - logs: result.into_logs().into_iter().map(Into::into).collect(), - ..Default::default() - })); - - // update add to total fees - let miner_fee = tx - .effective_tip_per_gas(Some(base_fee)) - .expect("fee is always valid; execution succeeded"); - total_fees += U256::from(miner_fee) * U256::from(gas_used); - - // append transaction to the list of executed transactions - executed_txs.push(tx.into_signed()); - } + // pre_block_beacon_root_contract_call( + // &mut sync_db, + // &evm_config, + // &chain_spec, + // &initialized_cfg, + // &initialized_block_env, + // attributes.inner.parent_beacon_block_root, + // ) + // .map_err(|err| { + // warn!(target: "payload_builder", + // parent_hash=%parent_block.hash(), + // %err, + // "failed to apply beacon root contract call for empty payload" + // ); + // PayloadBuilderError::Internal(err.into()) + // })?; + + // // apply eip-2935 blockhashes update + // pre_block_blockhashes_contract_call( + // &mut sync_db, + // &evm_config, + // &chain_spec, + // &initialized_cfg, + // &initialized_block_env, + // parent_block.hash(), + // ) + // .map_err(|err| { + // warn!(target: "payload_builder", parent_hash=%parent_block.hash(), %err, "failed to update blockhashes for empty payload"); + // PayloadBuilderError::Internal(err.into()) + // })?; + + // let mut receipts = Vec::new(); + // for tx in &attributes.transactions { + // // // ensure we still have capacity for this transaction + // // if cumulative_gas_used + tx.gas_limit() > block_gas_limit { + // // // we can't fit this transaction into the block, so we need to mark it as invalid + // // // which also removes all dependent transaction from the iterator before we can + // // // continue + // // best_txs.mark_invalid(&tx); + // // continue + // // } + + // // Check if the job was cancelled, if so we can exit early. + // if cancel.is_cancelled() { + // return Ok(BuildOutcome::Cancelled) + // } + + // let tx = tx.clone().1.try_into_ecrecovered().unwrap(); + + // // // There's only limited amount of blob space available per block, so we need to check if + // // // the EIP-4844 can still fit in the block + // // if let Some(blob_tx) = tx.transaction.as_eip4844() { + // // let tx_blob_gas = blob_tx.blob_gas(); + // // if sum_blob_gas_used + tx_blob_gas > MAX_DATA_GAS_PER_BLOCK { + // // // we can't fit this _blob_ transaction into the block, so we mark it as + // // // invalid, which removes its dependent transactions from + // // // the iterator. This is similar to the gas limit condition + // // // for regular transactions above. + // // trace!(target: "payload_builder", tx=?tx.hash, ?sum_blob_gas_used, ?tx_blob_gas, + // // "skipping blob transaction because it would exceed the max data gas per block"); + // // best_txs.mark_invalid(&tx); + // // continue + // // } + // // } + + // let env = EnvWithHandlerCfg::new_with_cfg_env( + // initialized_cfg.clone(), + // initialized_block_env.clone(), + // evm_config.tx_env(&tx), + // ); + + // // Configure the environment for the block. + // let mut evm = evm_config.evm_with_env(&mut sync_db, env); + + // let ResultAndState { result, state } = match evm.transact() { + // Ok(res) => res, + // Err(err) => { + // match err { + // EVMError::Transaction(err) => { + // println!("build tx error: {:?}", err); + // trace!(target: "payload_builder", %err, ?tx, "Error in sequencer transaction, skipping."); + // continue + // } + // err => { + // println!("build tx error fatal: {:?}", err); + // // this is an error that we should treat as fatal for this attempt + // //return Err(PayloadBuilderError::EvmExecutionError(err)) + // continue + // } + // } + // } + // }; + // // drop evm so db is released. + // drop(evm); + // // commit changes + // sync_db.commit(state); + + // // add to the total blob gas used if the transaction successfully executed + // if let Some(blob_tx) = tx.transaction.as_eip4844() { + // let tx_blob_gas = blob_tx.blob_gas(); + // sum_blob_gas_used += tx_blob_gas; + + // // if we've reached the max data gas per block, we can skip blob txs entirely + // if sum_blob_gas_used == MAX_DATA_GAS_PER_BLOCK { + // best_txs.skip_blobs(); + // } + // } + + // let gas_used = result.gas_used(); + + // // add gas used by the transaction to cumulative gas used, before creating the receipt + // cumulative_gas_used += gas_used; + + // // Push transaction changeset and calculate header bloom filter for receipt. + // #[allow(clippy::needless_update)] // side-effect of optimism fields + // receipts.push(Some(Receipt { + // tx_type: tx.tx_type(), + // success: result.is_success(), + // cumulative_gas_used, + // logs: result.into_logs().into_iter().map(Into::into).collect(), + // ..Default::default() + // })); + + // // update add to total fees + // let miner_fee = tx + // .effective_tip_per_gas(Some(base_fee)) + // .expect("fee is always valid; execution succeeded"); + // total_fees += U256::from(miner_fee) * U256::from(gas_used); + + // // append transaction to the list of executed transactions + // executed_txs.push(tx.into_signed()); + // } //println!("{} - Build: {:?}", chain_spec.chain().id(), executed_txs); + total_fees = U256::from(1u64); + // check if we have a better block - // if !is_better_payload(best_payload.as_ref(), total_fees) { + if !is_better_payload(best_payload.as_ref(), total_fees) { // can skip building the block - // return Ok(BuildOutcome::Aborted { - // fees: total_fees, - // cached_reads: sync_cached_reads.into(), - // }) - //} + return Ok(BuildOutcome::Aborted { + fees: total_fees, + cached_reads: sync_cached_reads.into(), + }) + } // merge all transitions into bundle state, this would apply the withdrawal balance changes // and 4788 contract call sync_db.merge_transitions(BundleRetention::PlainState); + // let execution_outcome = ExecutionOutcome::new( + // Some(chain_spec.chain().id()), + // sync_db.take_bundle(), + // vec![receipts].into(), + // block_number, + // vec![Requests::default()], + // ) + // .filter_current_chain(); + let execution_outcome = ExecutionOutcome::new( Some(chain_spec.chain().id()), - sync_db.take_bundle(), - vec![receipts].into(), + attributes.chain_da.state_diff.clone().unwrap().bundle.clone(), + vec![attributes.chain_da.state_diff.clone().unwrap().receipts.iter().map(|r| Some(r.clone())).collect::>()].into(), block_number, vec![Requests::default()], ) @@ -290,19 +301,37 @@ where )? }; - let state_diff = execution_outcome_to_state_diff(&execution_outcome, state_root, cumulative_gas_used); + //let state_diff = execution_outcome_to_state_diff(&execution_outcome, state_root, cumulative_gas_used); + + let state_diff = attributes.chain_da.state_diff.clone().unwrap(); + + // let execution_output_state_diff = state_diff_to_block_execution_output(chain_spec.chain().id(), &attributes.chain_da.state_diff.unwrap()); + // let state_root_2 = { + // let state_provider = sync_db.database.0.inner.borrow_mut(); + // state_provider.db.get_db(chain_spec.chain().id()).unwrap().state_root( + // HashedPostState::from_bundle_state(&execution_outcome.current_state().state), + // )? + // }; + + // let state_root_2 = ParallelStateRoot::new(consistent_view, hashed_state) + // .incremental_root_with_updates() + // .map(|(root, updates)| (root, Some(updates))) + // .map_err(ProviderError::from)?; + + let executed_txs = attributes.transactions.iter().cloned().map(|tx| tx.1.try_into_ecrecovered().unwrap().into_signed()).collect::>(); + // create the block header let transactions_root = proofs::calculate_transaction_root(&executed_txs); - let json_str = serde_json::to_string(&state_diff).unwrap(); - let serialized_bytes = json_str.into_bytes(); - let extra_data = Bytes::from(serialized_bytes); + // Put the state diff into the extra bytes of the block + //let extra_data = Bytes::from(serde_json::to_string(&state_diff).unwrap().into_bytes()); + //let extra_data = Bytes::from(bincode::serialize(&state_diff).unwrap()); let header = Header { parent_hash: parent_block.hash(), ommers_hash: EMPTY_OMMER_ROOT_HASH, beneficiary: initialized_block_env.coinbase.1, - state_root, + state_root: state_diff.state_root, transactions_root, receipts_root, withdrawals_root: Some(B256::from(hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"))), @@ -314,16 +343,25 @@ where number: parent_block.number + 1, gas_limit: block_gas_limit, difficulty: U256::ZERO, - gas_used: cumulative_gas_used, - extra_data, + //gas_used: cumulative_gas_used, + gas_used: state_diff.gas_used, + extra_data: attributes.chain_da.extra_data.clone(), parent_beacon_block_root: attributes.inner.parent_beacon_block_root, blob_gas_used: Some(0), excess_blob_gas: Some(0), - requests_root: Some(calculate_requests_root(&Vec::new())), + requests_root: None, }; println!("header: {:?}", header); + println!("[{}-{}] receipts: {:?}", chain_spec.chain().id(), header.number, state_diff.receipts); + + println!("extra_data: {}", attributes.chain_da.extra_data); + + if state_diff.state_root != state_root { + println!("State root mismatch! {} {}", state_diff.state_root, state_root); + } + // seal the block let block = Block { header, body: executed_txs, ommers: vec![], withdrawals: Some(Withdrawals::default()), requests: Some(Requests::default()) }; @@ -332,14 +370,12 @@ where println!("block hash: {:?}", sealed_block.hash()); - println!("execution outcome: {:?}", execution_outcome); + println!("[{}] execution outcome: {:?}", chain_spec.chain.id(), execution_outcome); - assert_eq!(state_diff, attributes.chain_da.state_diff.unwrap()); + //assert_eq!(state_diff, attributes.chain_da.state_diff.unwrap()); debug!(target: "payload_builder", ?sealed_block, "sealed built block"); - total_fees = U256::from(1u64); - let payload = EthBuiltPayload::new(attributes.inner.id, sealed_block, total_fees); Ok(BuildOutcome::Better { payload, cached_reads: /*sync_cached_reads.into())*/ CachedReads::default() }) diff --git a/crates/gwyneth/src/engine_api.rs b/crates/gwyneth/src/engine_api.rs index f27b61c827bd..030d066e4362 100644 --- a/crates/gwyneth/src/engine_api.rs +++ b/crates/gwyneth/src/engine_api.rs @@ -11,8 +11,7 @@ use reth_provider::CanonStateNotificationStream; use reth_rpc_api::EngineApiClient; use reth_rpc_layer::AuthClientService; use reth_rpc_types::{ - engine::{ForkchoiceState, PayloadStatusEnum}, - ExecutionPayloadV3, + engine::{ForkchoiceState, PayloadStatusEnum}, BlockNumberOrTag, ExecutionPayloadV3 }; use std::{marker::PhantomData, net::Ipv4Addr}; use reth_rpc_builder::constants; diff --git a/crates/gwyneth/src/exex.rs b/crates/gwyneth/src/exex.rs index b3e1eda5aa26..43ee56d1ba43 100644 --- a/crates/gwyneth/src/exex.rs +++ b/crates/gwyneth/src/exex.rs @@ -18,17 +18,18 @@ use reth_node_builder::{components::Components, FullNode, Node, NodeAdapter}; use reth_node_ethereum::{node::EthereumAddOns, EthExecutorProvider}; use reth_payload_builder::EthBuiltPayload; use reth_primitives::{ - address, Address, ChainDA, GwynethDA, SealedBlock, SealedBlockWithSenders, StateDiff, TransactionSigned, B256, U256 + address, Address, Bytes, ChainDA, GwynethDA, SealedBlock, SealedBlockWithSenders, StateDiff, TransactionSigned, B256, U256 }; use reth_provider::{ providers::BlockchainProvider, BlockNumReader, CanonStateSubscriptions, DatabaseProviderFactory, }; -use reth_rpc_types::engine::PayloadStatusEnum; +use reth_rpc_types::{engine::PayloadStatusEnum, BlockNumberOrTag}; use reth_transaction_pool::{ blobstore::DiskFileBlobStore, CoinbaseTipOrdering, EthPooledTransaction, EthTransactionValidator, Pool, TransactionValidationTaskExecutor, }; use RollupContract::{BlockProposed, RollupContractEvents}; +use reth_provider::BlockReaderIdExt; const ROLLUP_CONTRACT_ADDRESS: Address = address!("9fCF7D13d10dEdF17d0f24C62f0cf4ED462f65b7"); pub const BASE_CHAIN_ID: u64 = 167010; @@ -95,6 +96,7 @@ impl Rollup { } if let Some(committed_chain) = notification.committed_chain() { + println!("EXEX called for block {}", committed_chain.tip().number); for i in 0..self.nodes.len() { self.commit(&committed_chain, i).await?; } @@ -141,7 +143,18 @@ impl Rollup { let all_transactions: Vec = decode_transactions(&meta.txList); let node_chain_id = BASE_CHAIN_ID + (node_idx as u64); - let chain_da = da.chain_das.get(&node_chain_id).unwrap(); + let chain_da = da.chain_das.get(&node_chain_id); + if chain_da.is_none() { + println!("skipping: {}", node_chain_id); + continue; + } + let default_chain_da = ChainDA { + block_hash: B256::default(), + extra_data: Bytes::new(), + state_diff: None, + transactions: None, + }; + let chain_da = chain_da.unwrap_or(&default_chain_da); println!("chain_da: {:?}", chain_da); // let filtered_transactions: Vec = all_transactions @@ -158,11 +171,11 @@ impl Rollup { let attrs = GwynethPayloadAttributes { inner: EthPayloadAttributes { - timestamp: block.timestamp/* + node_idx as u64*/, - prev_randao: block.mix_hash, + timestamp: block.timestamp, + prev_randao: /*block.mix_hash*/ B256::ZERO, suggested_fee_recipient: meta.coinbase, withdrawals: Some(vec![]), - parent_beacon_block_root: block.parent_beacon_block_root, + parent_beacon_block_root: /*block.parent_beacon_block_root*/ Some(B256::ZERO), }, transactions: Some(filtered_transactions.clone()), chain_da: chain_da.clone(), @@ -251,12 +264,31 @@ impl Rollup { ) .await?; - assert_eq!(block_hash, chain_da.block_hash, "unexpected block hash"); + + if chain_da.block_hash != B256::ZERO { + assert_eq!(block_hash, chain_da.block_hash, "unexpected block hash for chain {} block {}", node_chain_id, payload.block().number); + } // trigger forkchoice update via engine api to commit the block to the blockchain self.engine_apis[node_idx].update_forkchoice(block_hash, block_hash).await?; - println!("Done with block {}: {}", node_chain_id, payload.block().number); + loop { + // wait for the block to commit + tokio::time::sleep(std::time::Duration::from_millis(1000)).await; + if let Some(latest_block) = + self.nodes[node_idx].provider.block_by_number_or_tag(BlockNumberOrTag::Latest)? + { + if latest_block.number == payload.block().number { + // make sure the block hash we submitted via FCU engine api is the new latest + // block using an RPC call + assert_eq!(latest_block.hash_slow(), block_hash); + break + } + } + println!("waiting on L2 block for {}: {}", node_chain_id, payload.block().number) + } + + println!("[L1 block {}] Done with block {}: {}", block.number, node_chain_id, payload.block().number); self.num_l2_blocks += 1; } diff --git a/crates/payload/validator/src/lib.rs b/crates/payload/validator/src/lib.rs index 6e21111e62f4..6f9024475d23 100644 --- a/crates/payload/validator/src/lib.rs +++ b/crates/payload/validator/src/lib.rs @@ -113,14 +113,17 @@ impl ExecutionPayloadValidator { payload: ExecutionPayload, cancun_fields: MaybeCancunPayloadFields, ) -> Result { + println!("ensure_well_formed_payload"); let expected_hash = payload.block_hash(); // First parse the block let sealed_block = - try_into_block(payload, cancun_fields.parent_beacon_block_root())?.seal_slow(); + try_into_block(payload.clone(), cancun_fields.parent_beacon_block_root())?.seal_slow(); // Ensure the hash included in the payload matches the block hash if expected_hash != sealed_block.hash() { + println!("payload: {:?}", payload); + println!("sealed_block: {:?}", sealed_block); return Err(PayloadError::BlockHash { execution: sealed_block.hash(), consensus: expected_hash, diff --git a/crates/storage/provider/src/providers/database/provider.rs b/crates/storage/provider/src/providers/database/provider.rs index 2400d85fd5bf..b5a0cfe44a95 100644 --- a/crates/storage/provider/src/providers/database/provider.rs +++ b/crates/storage/provider/src/providers/database/provider.rs @@ -1660,6 +1660,8 @@ impl DatabaseProvider { T: Table, { for (partial_key, indices) in index_updates { + println!("indices: {:?}", indices); + let last_shard = self.take_shard::(sharded_key_factory(partial_key, u64::MAX))?; // chunk indices and insert them in shards of N size. let indices = last_shard.iter().chain(indices.iter()); @@ -1677,6 +1679,7 @@ impl DatabaseProvider { // Insert last list with u64::MAX u64::MAX }; + println!("list: {:?}", list); self.tx.put::( sharded_key_factory(partial_key, highest_block_number), BlockNumberList::new_pre_sorted(list), @@ -2709,13 +2712,17 @@ impl StateChangeWriter for DatabaseProvider { } fn write_state_changes(&self, mut changes: StateChangeset) -> ProviderResult<()> { - changes.filter_for_chain(self.chain_spec.chain().id()); + println!("Writing state changes"); + + //changes.filter_for_chain(self.chain_spec.chain().id()); // sort all entries so they can be written to database in more performant way. // and take smaller memory footprint. changes.accounts.par_sort_by_key(|a| a.0); - changes.storage.par_sort_by_key(|a| a.address); + changes.storage.par_sort_by_key(|a| a.address.1); changes.contracts.par_sort_by_key(|a| a.0); + println!("changes: {:?}", changes); + // Write new account state tracing::trace!(len = changes.accounts.len(), "Writing new account state"); let mut accounts_cursor = self.tx_ref().cursor_write::()?; @@ -3210,7 +3217,12 @@ impl HistoryWriter for DatabaseProvider { // storage history stage { - let indices = self.changed_storages_and_blocks_with_range(range)?; + let mut indices = self.changed_storages_and_blocks_with_range(range)?; + // TODO(Brecht): hack + for set in indices.values_mut() { + let mut seen = HashSet::new(); + set.retain(|x| seen.insert(*x)); + } self.insert_storage_history_index(indices)?; } diff --git a/crates/storage/provider/src/writer/mod.rs b/crates/storage/provider/src/writer/mod.rs index 6ea62ad89df6..761a925c0afe 100644 --- a/crates/storage/provider/src/writer/mod.rs +++ b/crates/storage/provider/src/writer/mod.rs @@ -492,9 +492,13 @@ where execution_outcome: ExecutionOutcome, is_value_known: OriginalValuesKnown, ) -> ProviderResult<()> { + println!("write_to_storage"); let (plain_state, reverts) = execution_outcome.bundle.into_plain_state_and_reverts(is_value_known); + println!("plain state: {:?}", plain_state); + println!("reverts: {:?}", reverts); + self.database().write_state_reverts(reverts, execution_outcome.first_block)?; self.append_receipts_from_blocks( diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 0441cd645eff..bb95628c9c84 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -151,11 +151,12 @@ contract TaikoL1 is EssentialContract, TaikoEvents, TaikoErrors { // revert L1_INVALID_TIMESTAMP(); // } + require(_block.timestamp == block.timestamp, "included in an unexpected L1 block"); // Apply L1 state updates - // for (uint i = 0; i < _block.l1StateDiff.accounts.length; i++) { - // GwynethContract(_block.l1StateDiff.accounts[i].addr).applyStateDelta(_block.l1StateDiff.accounts[i].slots); - // } + for (uint i = 0; i < _block.l1StateDiff.accounts.length; i++) { + GwynethContract(_block.l1StateDiff.accounts[i].addr).applyStateDelta(_block.l1StateDiff.accounts[i].slots); + } emit BlockProposed({ blockId: _block.l2BlockNumber, meta: _block }); } diff --git a/packages/protocol/contracts/examples/xERC20.sol b/packages/protocol/contracts/examples/xERC20.sol index 153d4f0d5ea0..54a0fc644597 100644 --- a/packages/protocol/contracts/examples/xERC20.sol +++ b/packages/protocol/contracts/examples/xERC20.sol @@ -36,6 +36,18 @@ contract xERC20 is GwynethContract { return value; } + function xTransfer(uint256 fromChain, uint256 toChain, address to, uint256 value) public returns (uint256) { + EVM.xCallOptions(fromChain); + return this._xTransfer(msg.sender, toChain, to, value); + } + + function _xTransfer(address from, uint256 chain, address to, uint256 value) external returns (uint256) { + require(msg.sender == address(this), "Only contract itself can call this function"); + balanceOf[from] -= value; + EVM.xCallOptions(chain); + return this._mint(to, value); + } + function xTransfer(uint256 chain, address to, uint256 value) public returns (uint256) { balanceOf[msg.sender] -= value; EVM.xCallOptions(chain); diff --git a/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py b/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py index eb9321d03a96..37eec2036266 100644 --- a/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py +++ b/packages/protocol/scripts/L2_txn_simulation/check_xchain_balances.py @@ -1,6 +1,8 @@ from web3 import Web3 # Connect to the blockchain +RPC_URL_L1 = "http://127.0.0.1:32002" # Replace with your RPC URL +web3_l1 = Web3(Web3.HTTPProvider(RPC_URL_L1)) RPC_URL_A = "http://127.0.0.1:32005" # Replace with your RPC URL web3_l2a = Web3(Web3.HTTPProvider(RPC_URL_A)) RPC_URL_B = "http://127.0.0.1:32006" # Replace with your RPC URL @@ -9,14 +11,22 @@ def simulate_blockchain_call(contract_address, abi, function_name, *args): # Load the contract + contract = web3_l1.eth.contract(address=web3_l1.to_checksum_address(contract_address), abi=abi) contract_a = web3_l2a.eth.contract(address=web3_l2a.to_checksum_address(contract_address), abi=abi) contract_b = web3_l2b.eth.contract(address=web3_l2b.to_checksum_address(contract_address), abi=abi) # Get the contract function + contract_function = getattr(contract.functions, function_name)(*args) contract_a_function = getattr(contract_a.functions, function_name)(*args) contract_b_function = getattr(contract_b.functions, function_name)(*args) # Simulate the call + try: + response = contract_function.call() + print(f"Blockchain call successful. Response, from L1: {response}") + except Exception as e: + print(f"Error during blockchain call: {e}") + try: response = contract_a_function.call() print(f"Blockchain call successful. Response, from L2A: {response}") @@ -75,7 +85,9 @@ def simulate_blockchain_call(contract_address, abi, function_name, *args): ] # Simulate the blockchain call - print("Alice balance:") + print("Alice:") simulate_blockchain_call(example_contract_address, example_abi, "balanceOf", "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266") - print("Bob balance:") - simulate_blockchain_call(example_contract_address, example_abi, "balanceOf", "0xE25583099BA105D9ec0A67f5Ae86D90e50036425") \ No newline at end of file + print("Bob:") + simulate_blockchain_call(example_contract_address, example_abi, "balanceOf", "0xE25583099BA105D9ec0A67f5Ae86D90e50036425") + print("Charlie:") + simulate_blockchain_call(example_contract_address, example_abi, "balanceOf", "0x614561D2d143621E126e87831AEF287678B442b8") \ No newline at end of file diff --git a/packages/protocol/scripts/deploy_and_xtransfer.sh b/packages/protocol/scripts/deploy_and_xtransfer.sh index 60a1c2e6101f..e3ae00e08ff5 100755 --- a/packages/protocol/scripts/deploy_and_xtransfer.sh +++ b/packages/protocol/scripts/deploy_and_xtransfer.sh @@ -119,4 +119,9 @@ echo -e "${YELLOW}Waiting 5 seconds before executing xTransfer...${NC}" sleep 5 echo -e "${GREEN}Executing xTransfer...${NC}" -forge script scripts/XTransfer.s.sol --rpc-url http://127.0.0.1:32005 -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy \ No newline at end of file +forge script scripts/XTransfer.s.sol --rpc-url http://127.0.0.1:32005 -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy + +sleep 5 + +echo -e "${GREEN}Executing xWitdraw...${NC}" +forge script scripts/XWithdraw.s.sol --rpc-url http://127.0.0.1:32006 -vvvv --broadcast --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --legacy \ No newline at end of file diff --git a/packages/protocol/scripts/xTransfer.s.sol b/packages/protocol/scripts/xTransfer.s.sol index 5e0d3ce0e449..453e1173f9f2 100644 --- a/packages/protocol/scripts/xTransfer.s.sol +++ b/packages/protocol/scripts/xTransfer.s.sol @@ -32,18 +32,14 @@ contract XTransfer is Script { vm.startBroadcast(ALICE_PK); + // Deposit 999 tokens to L2A (chainId: 167010) + xERC20(TOKEN_ADDRESS).xTransfer(160010, 167010, ALICE, 999); + // Transfer 666 tokens to Bob on L2B (chainId: 167011) xERC20(TOKEN_ADDRESS).xTransfer(167011, BOB, 666); vm.stopBroadcast(); - vm.startBroadcast(BOB_PK); - - // Withdraw some tokens to L1 - xERC20(TOKEN_ADDRESS).xTransfer(160010, CHARLIE, 222); - - vm.stopBroadcast(); - console.log("\n=== After Transfer ==="); //checkBalances(); -> EXPLORER } diff --git a/packages/protocol/scripts/xWithdraw.s.sol b/packages/protocol/scripts/xWithdraw.s.sol new file mode 100644 index 000000000000..55c9cc5538bc --- /dev/null +++ b/packages/protocol/scripts/xWithdraw.s.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.19; + +import "forge-std/Script.sol"; +import "forge-std/console2.sol"; + +import "../contracts/examples/xERC20.sol"; + +contract XTransfer is Script { + // The deployed contract address (will be the same on both chains due to deterministic deployment) + address constant TOKEN_ADDRESS = 0x5FbDB2315678afecb367f032d93F642f64180aa3; + + address ALICE = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; //Can stay as is - test values anyways + address BOB = 0xE25583099BA105D9ec0A67f5Ae86D90e50036425; //Can stay as is - test values anyways + address CHARLIE = 0x614561D2d143621E126e87831AEF287678B442b8; //Can stay as is - test values anyways + uint256 ALICE_PK = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80;//Can stay as is - test values anyways + uint256 BOB_PK = 0x39725efee3fb28614de3bacaffe4cc4bd8c436257e2c8bb887c4b5c4be45e76d;//Can stay as is - test values anyways + + function setUp() public {} + + function run() public { + address bob = vm.addr(BOB_PK); + + vm.startBroadcast(); + // Sending 1 ETH + (bool success, ) = bob.call{value: 1 ether}(""); + require(success, "Failed to send Ether"); + vm.stopBroadcast(); + + console.log("\n=== Before Transfer ==="); + + vm.startBroadcast(BOB_PK); + + // Withdraw some tokens to L1 + xERC20(TOKEN_ADDRESS).xTransfer(160010, CHARLIE, 222); + + vm.stopBroadcast(); + + console.log("\n=== After Transfer ==="); + //checkBalances(); -> EXPLORER + } +} \ No newline at end of file