From 6a24f7328505809dde5efb874c8f0d5beab1531d Mon Sep 17 00:00:00 2001 From: Brechtpd Date: Fri, 26 Jul 2024 03:07:41 +0200 Subject: [PATCH] wip exex integration --- .gitignore | 4 +- Cargo.lock | 248 +++++++-- Cargo.toml | 5 + bin/reth/Cargo.toml | 8 + bin/reth/TaikoL1.json | 1 + .../src/commands/debug_cmd/build_block.rs | 3 + .../commands/debug_cmd/in_memory_merkle.rs | 1 + bin/reth/src/db.rs | 460 +++++++++++++++++ bin/reth/src/execution.rs | 479 ++++++++++++++++++ bin/reth/src/main.rs | 311 +++++++++++- crates/blockchain-tree/src/blockchain_tree.rs | 2 + crates/blockchain-tree/src/chain.rs | 1 + crates/cli/commands/src/common.rs | 1 + crates/cli/commands/src/node.rs | 1 + crates/cli/commands/src/stage/dump/mod.rs | 1 + crates/consensus/auto-seal/src/lib.rs | 2 + crates/consensus/beacon/src/engine/handle.rs | 5 +- crates/consensus/beacon/src/engine/mod.rs | 2 + crates/e2e-test-utils/src/lib.rs | 4 +- crates/e2e-test-utils/src/node.rs | 6 + crates/engine/tree/src/tree/mod.rs | 3 + crates/ethereum/evm/src/execute.rs | 8 +- crates/ethereum/node/src/launch.rs | 2 + crates/ethereum/node/src/node.rs | 1 + crates/ethereum/node/tests/e2e/eth.rs | 2 + crates/ethereum/payload/src/lib.rs | 2 + crates/exex/exex/src/backfill/job.rs | 2 + crates/exex/exex/src/backfill/test_utils.rs | 2 + crates/exex/test-utils/src/lib.rs | 1 + crates/node/builder/src/launch/common.rs | 3 +- crates/node/builder/src/launch/mod.rs | 3 + crates/optimism/payload/src/builder.rs | 1 + crates/revm/src/database.rs | 4 +- .../storage/db/src/implementation/mdbx/mod.rs | 1 + crates/storage/db/src/mdbx.rs | 4 +- .../provider/src/providers/database/mod.rs | 1 + .../protocol/contracts/L1/TaikoEvents.sol | 2 +- packages/protocol/contracts/L1/TaikoL1.sol | 2 +- packages/protocol/deployments/deploy_l1.json | 12 +- packages/protocol/scripts/setup_deps.sh | 10 +- 40 files changed, 1537 insertions(+), 74 deletions(-) create mode 100644 bin/reth/TaikoL1.json create mode 100644 bin/reth/src/db.rs create mode 100644 bin/reth/src/execution.rs diff --git a/.gitignore b/.gitignore index 2d5d851a5055..06ec65f0d53b 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,6 @@ jwttoken/ crates/storage/libmdbx-rs/mdbx-sys/libmdbx/cmake-build-debug # Rust bug report -rustc-ice-* \ No newline at end of file +rustc-ice-* + +packages/protocol/broadcast/** \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 0917ffeb1ca8..a46c980c6341 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -121,16 +121,30 @@ dependencies = [ "strum", ] +[[package]] +name = "alloy-consensus" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da374e868f54c7f4ad2ad56829827badca388efd645f8cf5fccc61c2b5343504" +dependencies = [ + "alloy-eips 0.1.4", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.1.4", + "c-kzg", + "serde", +] + [[package]] name = "alloy-consensus" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f58047cc851e58c26224521d1ecda466e3d746ebca0274cd5427aa660a88c353" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "alloy-primitives", "alloy-rlp", - "alloy-serde", + "alloy-serde 0.2.0", "arbitrary", "c-kzg", "serde", @@ -154,6 +168,21 @@ dependencies = [ "winnow 0.6.13", ] +[[package]] +name = "alloy-eips" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f76ecab54890cdea1e4808fc0891c7e6cfcf71fe1a9fe26810c7280ef768f4ed" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.1.4", + "c-kzg", + "once_cell", + "serde", + "sha2 0.10.8", +] + [[package]] name = "alloy-eips" version = "0.2.0" @@ -162,7 +191,7 @@ checksum = "d32a3e14fa0d152d00bd8daf605eb74ad397efb0f54bd7155585823dddb4401e" dependencies = [ "alloy-primitives", "alloy-rlp", - "alloy-serde", + "alloy-serde 0.2.0", "arbitrary", "c-kzg", "derive_more", @@ -179,7 +208,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20cb76c8a3913f2466c5488f3a915e3a15d15596bdc935558c1a9be75e9ec508" dependencies = [ "alloy-primitives", - "alloy-serde", + "alloy-serde 0.2.0", "serde", ] @@ -214,12 +243,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3223d71dc78f464b2743418d0be8b5c894313e272105a6206ad5e867d67b3ce2" dependencies = [ - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.2.0", + "alloy-eips 0.2.0", "alloy-json-rpc", "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", + "alloy-rpc-types-eth 0.2.0", + "alloy-serde 0.2.0", "alloy-signer", "alloy-sol-types", "async-trait", @@ -278,8 +307,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f29da7457d853cb8199ec04b227d5d2ef598be3e59fc2bbad70c8be213292f32" dependencies = [ "alloy-chains", - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.2.0", + "alloy-eips 0.2.0", "alloy-json-rpc", "alloy-network", "alloy-primitives", @@ -287,7 +316,7 @@ dependencies = [ "alloy-rpc-client", "alloy-rpc-types-admin", "alloy-rpc-types-engine", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 0.2.0", "alloy-transport", "alloy-transport-http", "alloy-transport-ws", @@ -379,9 +408,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e5d76f1e8b22f48b7b8f985782b68e7eb3938780e50e8b646a53e41a598cdf5" dependencies = [ "alloy-rpc-types-engine", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 0.2.0", "alloy-rpc-types-trace", - "alloy-serde", + "alloy-serde 0.2.0", "serde", ] @@ -404,7 +433,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4282c002a4ae9f57887dae57083fcca6dca09cb6685bf98b8582ea93cb3df97d" dependencies = [ "alloy-primitives", - "alloy-serde", + "alloy-serde 0.2.0", "serde", ] @@ -414,7 +443,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b47dcc8e3bebea57b1c9495a7e6f3313e99d355c0f5b80473cfbdfcbdd6ebea" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "alloy-primitives", "alloy-rpc-types-engine", "serde", @@ -428,12 +457,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73445fbc5c02258e3d0d977835c92366a4d91545fd456c3fc8601c61810bc9f6" dependencies = [ - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.2.0", + "alloy-eips 0.2.0", "alloy-primitives", "alloy-rlp", - "alloy-rpc-types-eth", - "alloy-serde", + "alloy-rpc-types-eth 0.2.0", + "alloy-serde 0.2.0", "jsonrpsee-types", "jsonwebtoken", "rand 0.8.5", @@ -441,17 +470,35 @@ dependencies = [ "thiserror", ] +[[package]] +name = "alloy-rpc-types-eth" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab4123ee21f99ba4bd31bfa36ba89112a18a500f8b452f02b35708b1b951e2b9" +dependencies = [ + "alloy-consensus 0.1.4", + "alloy-eips 0.1.4", + "alloy-primitives", + "alloy-rlp", + "alloy-serde 0.1.4", + "alloy-sol-types", + "itertools 0.13.0", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "alloy-rpc-types-eth" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "605fa8462732bb8fd0645a9941e12961e079d45ae6a44634c826f8229c187bdf" dependencies = [ - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.2.0", + "alloy-eips 0.2.0", "alloy-primitives", "alloy-rlp", - "alloy-serde", + "alloy-serde 0.2.0", "alloy-sol-types", "arbitrary", "itertools 0.13.0", @@ -467,9 +514,9 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ffcb83a5a91d327c40ba2157a19016bb883c1426f1708fea5f9e042032fd73e" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "alloy-primitives", - "alloy-serde", + "alloy-serde 0.2.0", "serde", "serde_json", ] @@ -481,8 +528,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f561a8cdd377b6ac3beab805b9df5ec2c7d99bb6139aab23c317f26df6fb346" dependencies = [ "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", + "alloy-rpc-types-eth 0.2.0", + "alloy-serde 0.2.0", "serde", "serde_json", "thiserror", @@ -495,11 +542,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06a4bd39910631c11148c5b2c55e2c61f8626affd2a612e382c668d5e5971ce" dependencies = [ "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", + "alloy-rpc-types-eth 0.2.0", + "alloy-serde 0.2.0", "serde", ] +[[package]] +name = "alloy-serde" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9416c52959e66ead795a11f4a86c248410e9e368a0765710e57055b8a1774dd6" +dependencies = [ + "alloy-primitives", + "serde", + "serde_json", +] + [[package]] name = "alloy-serde" version = "0.2.0" @@ -532,7 +590,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b537f3e55f30753578f4623d5f66ddad8fa582af3fa6b15bad23dd1b9775228" dependencies = [ - "alloy-consensus", + "alloy-consensus 0.2.0", "alloy-network", "alloy-primitives", "alloy-signer", @@ -564,6 +622,7 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" dependencies = [ + "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck 0.5.0", @@ -582,11 +641,13 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" dependencies = [ + "alloy-json-abi", "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", + "serde_json", "syn 2.0.71", "syn-solidity", ] @@ -607,6 +668,7 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" dependencies = [ + "alloy-json-abi", "alloy-primitives", "alloy-sol-macro", "const-hex", @@ -2460,7 +2522,7 @@ dependencies = [ "enr", "fnv", "futures", - "hashlink", + "hashlink 0.8.4", "hex", "hkdf", "lazy_static", @@ -3018,6 +3080,18 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fast-float" version = "0.2.0" @@ -3127,6 +3201,22 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "foundry-blob-explorers" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "753c1ac681e3489cb10eedb0765032338913b7847aabcaf3fefd810f6b03712d" +dependencies = [ + "alloy-chains", + "alloy-eips 0.1.4", + "alloy-primitives", + "alloy-rpc-types-eth 0.1.4", + "alloy-serde 0.1.4", + "chrono", + "reqwest", + "serde", +] + [[package]] name = "fragile" version = "2.0.0" @@ -3441,6 +3531,15 @@ dependencies = [ "hashbrown 0.14.5", ] +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + [[package]] name = "hdrhistogram" version = "7.5.4" @@ -4643,6 +4742,17 @@ dependencies = [ "libsecp256k1-core", ] +[[package]] +name = "libsqlite3-sys" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linked-hash-map" version = "0.5.6" @@ -5208,11 +5318,11 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d10e10cbbdb3931fed5109bbd570c0a6cf0ce08db1f93401cfb5cefc51998d1" dependencies = [ - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.2.0", + "alloy-eips 0.2.0", "alloy-primitives", "alloy-rlp", - "alloy-serde", + "alloy-serde 0.2.0", "serde", ] @@ -5224,8 +5334,8 @@ checksum = "9978c3d449abb03526d378988ae6d51b049ef36205cc97bf284574df9f578021" dependencies = [ "alloy-network", "alloy-primitives", - "alloy-rpc-types-eth", - "alloy-serde", + "alloy-rpc-types-eth 0.2.0", + "alloy-serde 0.2.0", "op-alloy-consensus", "serde", "serde_json", @@ -6194,7 +6304,9 @@ dependencies = [ name = "reth" version = "1.0.3" dependencies = [ + "alloy-consensus 0.2.0", "alloy-rlp", + "alloy-sol-types", "aquamarine", "backon", "clap", @@ -6202,10 +6314,12 @@ dependencies = [ "discv5", "eyre", "fdlimit", + "foundry-blob-explorers", "futures", "itertools 0.13.0", "libc", "metrics-process", + "once_cell", "reth-basic-payload-builder", "reth-beacon-consensus", "reth-blockchain-tree", @@ -6225,6 +6339,7 @@ dependencies = [ "reth-errors", "reth-ethereum-payload-builder", "reth-evm", + "reth-execution-errors", "reth-execution-types", "reth-exex", "reth-fs-util", @@ -6261,6 +6376,7 @@ dependencies = [ "reth-tracing", "reth-transaction-pool", "reth-trie", + "rusqlite", "serde", "serde_json", "similar-asserts", @@ -6374,8 +6490,8 @@ dependencies = [ name = "reth-bench" version = "1.0.3" dependencies = [ - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.2.0", + "alloy-eips 0.2.0", "alloy-json-rpc", "alloy-provider", "alloy-pubsub", @@ -6461,7 +6577,7 @@ name = "reth-chainspec" version = "1.0.3" dependencies = [ "alloy-chains", - "alloy-eips", + "alloy-eips 0.2.0", "alloy-genesis", "alloy-primitives", "alloy-rlp", @@ -6556,7 +6672,7 @@ dependencies = [ name = "reth-cli-util" version = "1.0.3" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "alloy-primitives", "eyre", "libc", @@ -6571,8 +6687,8 @@ dependencies = [ name = "reth-codecs" version = "1.0.3" dependencies = [ - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.2.0", + "alloy-eips 0.2.0", "alloy-genesis", "alloy-primitives", "alloy-trie", @@ -6638,8 +6754,8 @@ dependencies = [ name = "reth-consensus-debug-client" version = "1.0.3" dependencies = [ - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.2.0", + "alloy-eips 0.2.0", "alloy-provider", "auto_impl", "eyre", @@ -6871,7 +6987,7 @@ dependencies = [ name = "reth-e2e-test-utils" version = "1.0.3" dependencies = [ - "alloy-consensus", + "alloy-consensus 0.2.0", "alloy-network", "alloy-rpc-types", "alloy-signer", @@ -7193,7 +7309,7 @@ dependencies = [ name = "reth-evm" version = "1.0.3" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "auto_impl", "futures-util", "parking_lot 0.12.3", @@ -7211,7 +7327,7 @@ dependencies = [ name = "reth-evm-ethereum" version = "1.0.3" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "alloy-sol-types", "reth-chainspec", "reth-ethereum-consensus", @@ -7251,7 +7367,7 @@ dependencies = [ name = "reth-execution-errors" version = "1.0.3" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "alloy-primitives", "reth-consensus", "reth-prune-types", @@ -7264,7 +7380,7 @@ dependencies = [ name = "reth-execution-types" version = "1.0.3" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "alloy-primitives", "reth-chainspec", "reth-execution-errors", @@ -7988,7 +8104,7 @@ dependencies = [ name = "reth-primitives" version = "1.0.3" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "alloy-genesis", "alloy-primitives", "alloy-rlp", @@ -8032,12 +8148,12 @@ dependencies = [ name = "reth-primitives-traits" version = "1.0.3" dependencies = [ - "alloy-consensus", - "alloy-eips", + "alloy-consensus 0.2.0", + "alloy-eips 0.2.0", "alloy-genesis", "alloy-primitives", "alloy-rlp", - "alloy-rpc-types-eth", + "alloy-rpc-types-eth 0.2.0", "arbitrary", "byteorder", "bytes", @@ -8152,7 +8268,7 @@ dependencies = [ name = "reth-revm" version = "1.0.3" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "reth-chainspec", "reth-consensus-common", "reth-ethereum-forks", @@ -8443,7 +8559,7 @@ dependencies = [ "alloy-rpc-types-mev", "alloy-rpc-types-trace", "alloy-rpc-types-txpool", - "alloy-serde", + "alloy-serde 0.2.0", "arbitrary", "bytes", "jsonrpsee-types", @@ -8747,7 +8863,7 @@ dependencies = [ name = "reth-trie-common" version = "1.0.3" dependencies = [ - "alloy-consensus", + "alloy-consensus 0.2.0", "alloy-genesis", "alloy-primitives", "alloy-rlp", @@ -8867,7 +8983,7 @@ version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fc4311037ee093ec50ec734e1424fcb3e12d535c6cef683b75d1c064639630c" dependencies = [ - "alloy-eips", + "alloy-eips 0.2.0", "alloy-primitives", "auto_impl", "bitflags 2.6.0", @@ -9008,6 +9124,20 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" +[[package]] +name = "rusqlite" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae" +dependencies = [ + "bitflags 2.6.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink 0.9.1", + "libsqlite3-sys", + "smallvec", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -10735,6 +10865,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vergen" version = "8.3.2" diff --git a/Cargo.toml b/Cargo.toml index a453692635fd..a5d9a39a05f0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -539,3 +539,8 @@ serial_test = "3" similar-asserts = "1.5.0" test-fuzz = "5" iai-callgrind = "0.11" + + +#[patch.crates-io] +#revm = { path = "../revm/crates/revm" } +#revm-primitives = { path = "../revm/crates/primitives" } \ No newline at end of file diff --git a/bin/reth/Cargo.toml b/bin/reth/Cargo.toml index d67436121e7c..be3164259101 100644 --- a/bin/reth/Cargo.toml +++ b/bin/reth/Cargo.toml @@ -26,6 +26,7 @@ reth-evm.workspace = true reth-revm.workspace = true reth-stages.workspace = true reth-execution-types.workspace = true +reth-execution-errors.workspace = true reth-errors.workspace = true reth-transaction-pool.workspace = true reth-beacon-consensus.workspace = true @@ -104,10 +105,17 @@ tempfile.workspace = true backon.workspace = true similar-asserts.workspace = true itertools.workspace = true +once_cell = "1" +rusqlite = { version = "0.31.0", features = ["bundled"] } +foundry-blob-explorers = "0.5" # p2p discv5.workspace = true +# alloy +alloy-consensus = { version = "0.2", features = ["kzg"] } +alloy-sol-types = { workspace = true, features = ["json"] } + [target.'cfg(unix)'.dependencies] tikv-jemallocator = { version = "0.5.0", optional = true } libc = "0.2" diff --git a/bin/reth/TaikoL1.json b/bin/reth/TaikoL1.json new file mode 100644 index 000000000000..7e7f0af8b67c --- /dev/null +++ b/bin/reth/TaikoL1.json @@ -0,0 +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":"bytes[]","internalType":"bytes[]"},{"name":"txLists","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"}]}],"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","indexed":false,"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":"0x60a06040523060805234801562000014575f80fd5b506200001f6200002f565b620000296200002f565b620000ed565b5f54610100900460ff16156200009b5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000eb575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051612311620001225f395f8181610792015281816107d201528181610881015281816108c1015261093c01526123115ff3fe608060405260043610610147575f3560e01c806372b6347b116100b3578063a86f9d9e1161006d578063a86f9d9e1461034a578063c19d93fb14610369578063c3f909d4146103fb578063e07baba614610445578063e30c397814610482578063f2fde38b1461049f575f80fd5b806372b6347b146102bb57806379ba5097146102db57806381e3925f146102ef5780638456cb59146103055780638abf6077146103195780638da5cb5b1461032d575f80fd5b80633f4ba83a116101045780633f4ba83a146102295780634f1ef2861461023d57806352d1902d146102505780635c975abb146102725780636b5ad7e014610292578063715018a6146102a7575f80fd5b806310f3ab1b1461014b5780633075db561461017f578063347258aa146101935780633659cfe6146101b45780633ab76e9f146101d35780633eb6b8cf1461020a575b5f80fd5b348015610156575f80fd5b5061016a610165366004611b6b565b6104be565b60405190151581526020015b60405180910390f35b34801561018a575f80fd5b5061016a61051f565b34801561019e575f80fd5b506101b26101ad366004611bf3565b610533565b005b3480156101bf575f80fd5b506101b26101ce366004611c31565b610788565b3480156101de575f80fd5b506097546101f2906001600160a01b031681565b6040516001600160a01b039091168152602001610176565b348015610215575f80fd5b506101f2610224366004611c6b565b61084f565b348015610234575f80fd5b506101b2610863565b6101b261024b366004611ca8565b610877565b34801561025b575f80fd5b50610264610930565b604051908152602001610176565b34801561027d575f80fd5b5061016a60c954610100900460ff1660021490565b34801561029d575f80fd5b5061026461708081565b3480156102b2575f80fd5b506101b26109e1565b6102ce6102c9366004611d90565b6109f2565b6040516101769190611ee0565b3480156102e6575f80fd5b506101b2610c4b565b3480156102fa575f80fd5b506102646202000081565b348015610310575f80fd5b506101b2610cc2565b348015610324575f80fd5b506101f2610cd5565b348015610338575f80fd5b506033546001600160a01b03166101f2565b348015610355575f80fd5b506101f2610364366004611f2e565b610ce3565b348015610374575f80fd5b5060fd5460fe546103b9916001600160401b0380821692600160401b8304821692600160801b8104831692600160c01b90910481169160ff8116916101009091041686565b604080516001600160401b03978816815295871660208701529386169385019390935290841660608401521515608083015290911660a082015260c001610176565b348015610406575f80fd5b5061040f610cf8565b6040805182516001600160401b0316815260208084015163ffffffff16908201529181015162ffffff1690820152606001610176565b348015610450575f80fd5b5060c95461046a906201000090046001600160401b031681565b6040516001600160401b039091168152602001610176565b34801561048d575f80fd5b506065546001600160a01b03166101f2565b3480156104aa575f80fd5b506101b26104b9366004611c31565b610d3c565b5f6001825f01516001600160401b03161115806104e35750602082015163ffffffff16155b806104f55750604082015162ffffff16155b8061050b575062020000826040015162ffffff16115b1561051757505f919050565b506001919050565b5f600261052a610dad565b60ff1614905090565b5f54610100900460ff161580801561055157505f54600160ff909116105b8061056a5750303b15801561056a57505f5460ff166001145b6105d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156105f3575f805461ff0019166101001790555b6105fd8484610dec565b5f610606610cf8565b9050610611816104be565b61064e5760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420636f6e66696760901b60448201526064016105c9565b60fd805467ffffffffffffffff60801b19426001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff19909316439190911617821716600160801b179091555f80805260fb6020527fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d89758581557fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d897780546fffffffffffffffff000000000000000019169093179092556040517f68b82650828a9621868d09dc161400acbe189fa002e3fb7cf9dea5c2c6f928ee906107339087815260200190565b60405180910390a250508015610782575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036107d05760405162461bcd60e51b81526004016105c990611f5c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610802610e2b565b6001600160a01b0316146108285760405162461bcd60e51b81526004016105c990611fa8565b61083181610e46565b604080515f8082526020820190925261084c91839190610e4e565b50565b5f61085b848484610fb8565b949350505050565b61086b6110a9565b610875335f611139565b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108bf5760405162461bcd60e51b81526004016105c990611f5c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108f1610e2b565b6001600160a01b0316146109175760405162461bcd60e51b81526004016105c990611fa8565b61092082610e46565b61092c82826001610e4e565b5050565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109cf5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016105c9565b505f8051602061229583398151915290565b6109e961113d565b6108755f611197565b606060026109fe610dad565b60ff1603610a1f5760405163dfc60d8560e01b815260040160405180910390fd5b610a2960026111b0565b610a3d60c954610100900460ff1660021490565b15610a5b5760405163bae6e2a960e01b815260040160405180910390fd5b8115610ab057838214610ab05760405162461bcd60e51b815260206004820152601860248201527f6d69736d61746368656420706172616d73206c656e677468000000000000000060448201526064016105c9565b836001600160401b03811115610ac857610ac8611abe565b604051908082528060200260200182016040528015610b0157816020015b610aee611a43565b815260200190600190039081610ae65790505b5090505f5b84811015610c40578215610bba57610b98868683818110610b2957610b29611ff4565b9050602002810190610b3b9190612008565b868685818110610b4d57610b4d611ff4565b9050602002810190610b5f9190612008565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506111f892505050565b828281518110610baa57610baa611ff4565b6020026020010181905250610c13565b610bf5868683818110610bcf57610bcf611ff4565b9050602002810190610be19190612008565b60405180602001604052805f8152506111f8565b828281518110610c0757610c07611ff4565b60200260200101819052505b610c1b61156d565b610c38576040516306b7162d60e51b815260040160405180910390fd5b600101610b06565b5061085b60016111b0565b60655433906001600160a01b03168114610cb95760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016105c9565b61084c81611197565b610cca61161a565b610875336001611139565b5f610cde610e2b565b905090565b5f610cef468484610fb8565b90505b92915050565b604080516060810182525f8082526020820181905291810191909152506040805160608101825262028c60815262e4e1c060208201526201d4c09181019190915290565b610d4461113d565b606580546001600160a01b0383166001600160a01b03199091168117909155610d756033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f610db74661168b565b15610de257507fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5c90565b5060c95460ff1690565b806001600160a01b038116610e145760405163538ba4f960e01b815260040160405180910390fd5b610e1d836116b8565b610e2682611716565b505050565b5f80516020612295833981519152546001600160a01b031690565b61084c61113d565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610e8157610e2683611786565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610edb575060408051601f3d908101601f19168201909252610ed89181019061204a565b60015b610f3e5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016105c9565b5f805160206122958339815191528114610fac5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016105c9565b50610e26838383611821565b6097545f906001600160a01b031680610fe457604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0386166004820152602481018590526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611036573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105a9190612061565b91508215801561107157506001600160a01b038216155b156110a157604051632b0d65db60e01b81526001600160401b0386166004820152602481018590526044016105c9565b509392505050565b6110bd60c954610100900460ff1660021490565b6110da5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b61092c5b6033546001600160a01b031633146108755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c9565b606580546001600160a01b031916905561084c81611845565b6111b94661168b565b156111e457807fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5d50565b60c9805460ff831660ff1990911617905550565b611200611a43565b5f611209610cf8565b90506112178486018661207c565b915081610140015163ffffffff164082606001511461126f5760405162461bcd60e51b81526020600482015260146024820152730929cac82989288be9862be84989e86969082a6960631b60448201526064016105c9565b81515f036112b65760405162461bcd60e51b81526020600482015260146024820152730929cac82989288be9864be84989e86969082a6960631b60448201526064016105c9565b806020015163ffffffff1682610120015163ffffffff161461130e5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d1d054d7d312535255607a1b60448201526064016105c9565b82516101c0830151151590151461135b5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d09313d097d554d151607a1b60448201526064016105c9565b816101c00151156113d15762020000826101a0015162ffffff1683610180015162ffffff1661138a919061216b565b11156113cc5760405162461bcd60e51b8152602060048201526011602482015270696e76616c696420626c6f622073697a6560781b60448201526064016105c9565b6114c4565b8251602084012060a0830151146114205760405162461bcd60e51b81526020600482015260136024820152720929cac82989288bea8b09892a6a8be9082a69606b1b60448201526064016105c9565b61018082015162ffffff161561146f5760405162461bcd60e51b81526020600482015260146024820152731253959053125117d516131254d517d4d510549560621b60448201526064016105c9565b825162ffffff16826101a0015162ffffff16146114c45760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f54584c4953545f53495a4560681b60448201526064016105c9565b806040015162ffffff16826101a0015162ffffff16111561151d5760405162461bcd60e51b8152602060048201526013602482015272696e76616c69642074786c6973742073697a6560681b60448201526064016105c9565b8161010001516001600160401b03167fbd2c05d5badfa6f80444e5b9b03b37e46106355960c43e72567a05c323213972838560405161155d9291906121d7565b60405180910390a2509392505050565b5f8061158f7173657175656e6365725f726567697374727960701b6001610ce3565b90506001600160a01b038116156116125760405163061caba560e21b81523360048201526001600160a01b03821690631872ae94906024016020604051808303815f875af11580156115e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116079190612201565b611612575f91505090565b600191505090565b61162e60c954610100900460ff1660021490565b1561164c5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589060200161112f565b5f600182148061169c575061426882145b806116a9575062aa36a782145b80610cf25750610cf282611896565b5f54610100900460ff166116de5760405162461bcd60e51b81526004016105c99061221c565b6116e66118ad565b6117046001600160a01b038216156116fe5781611197565b33611197565b5060c9805461ff001916610100179055565b5f54610100900460ff1661173c5760405162461bcd60e51b81526004016105c99061221c565b6001600160401b034611156117645760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381163b6117f35760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016105c9565b5f8051602061229583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61182a836118d3565b5f825111806118365750805b15610e26576107828383611912565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f617e2c8210158015610cf2575050617e90101590565b5f54610100900460ff166108755760405162461bcd60e51b81526004016105c99061221c565b6118dc81611786565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610cef83836040518060600160405280602781526020016122b56027913960605f80856001600160a01b03168560405161194e9190612267565b5f60405180830381855af49150503d805f8114611986576040519150601f19603f3d011682016040523d82523d5f602084013e61198b565b606091505b509150915061199c868383876119a6565b9695505050505050565b60608315611a145782515f03611a0d576001600160a01b0385163b611a0d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105c9565b508161085b565b61085b8383815115611a295781518083602001fd5b8060405162461bcd60e51b81526004016105c99190612282565b604080516101e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915290565b634e487b7160e01b5f52604160045260245ffd5b6040516101e081016001600160401b0381118282101715611af557611af5611abe565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611b2357611b23611abe565b604052919050565b80356001600160401b0381168114611b41575f80fd5b919050565b803563ffffffff81168114611b41575f80fd5b803562ffffff81168114611b41575f80fd5b5f60608284031215611b7b575f80fd5b604051606081018181106001600160401b0382111715611b9d57611b9d611abe565b604052611ba983611b2b565b8152611bb760208401611b46565b6020820152611bc860408401611b59565b60408201529392505050565b6001600160a01b038116811461084c575f80fd5b8035611b4181611bd4565b5f805f60608486031215611c05575f80fd5b8335611c1081611bd4565b92506020840135611c2081611bd4565b929592945050506040919091013590565b5f60208284031215611c41575f80fd5b8135611c4c81611bd4565b9392505050565b801515811461084c575f80fd5b8035611b4181611c53565b5f805f60608486031215611c7d575f80fd5b611c8684611b2b565b9250602084013591506040840135611c9d81611c53565b809150509250925092565b5f8060408385031215611cb9575f80fd5b8235611cc481611bd4565b91506020838101356001600160401b0380821115611ce0575f80fd5b818601915086601f830112611cf3575f80fd5b813581811115611d0557611d05611abe565b611d17601f8201601f19168501611afb565b91508082528784828501011115611d2c575f80fd5b80848401858401375f848284010152508093505050509250929050565b5f8083601f840112611d59575f80fd5b5081356001600160401b03811115611d6f575f80fd5b6020830191508360208260051b8501011115611d89575f80fd5b9250929050565b5f805f8060408587031215611da3575f80fd5b84356001600160401b0380821115611db9575f80fd5b611dc588838901611d49565b90965094506020870135915080821115611ddd575f80fd5b50611dea87828801611d49565b95989497509550505050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e0810151611e5060e08401826001600160a01b03169052565b50610100818101516001600160401b0381168483015250506101208181015163ffffffff81168483015250506101408181015163ffffffff8116848301525050610160818101516001600160401b0381168483015250506101808181015162ffffff81168483015250506101a08181015162ffffff81168483015250506101c08181015180151584830152610782565b602080825282518282018190525f9190848201906040850190845b81811015611f2257611f0e838551611df6565b928401926101e09290920191600101611efb565b50909695505050505050565b5f8060408385031215611f3f575f80fd5b823591506020830135611f5181611c53565b809150509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e1984360301811261201d575f80fd5b8301803591506001600160401b03821115612036575f80fd5b602001915036819003821315611d89575f80fd5b5f6020828403121561205a575f80fd5b5051919050565b5f60208284031215612071575f80fd5b8151611c4c81611bd4565b5f6101e0828403121561208d575f80fd5b612095611ad2565b823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c08201526120e160e08401611be8565b60e08201526101006120f4818501611b2b565b90820152610120612106848201611b46565b90820152610140612118848201611b46565b9082015261016061212a848201611b2b565b9082015261018061213c848201611b59565b908201526101a061214e848201611b59565b908201526101c0612160848201611c60565b908201529392505050565b80820180821115610cf257634e487b7160e01b5f52601160045260245ffd5b5f5b838110156121a457818101518382015260200161218c565b50505f910152565b5f81518084526121c381602086016020860161218a565b601f01601f19169290920160200192915050565b5f6102006121e58386611df6565b806101e08401526121f8818401856121ac565b95945050505050565b5f60208284031215612211575f80fd5b8151611c4c81611c53565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f825161227881846020870161218a565b9190910192915050565b602081525f610cef60208301846121ac56fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ee1e2d5e19fd22ee86db42e3f8fe483b9471d6010437fee30198d9eebc69e46c64736f6c63430008180033","sourceMap":"394:8145:4:-:0;;;1088:4:53;1045:48;;394:8145:4;;;;;;;;;-1:-1:-1;1488:22:15;:20;:22::i;:::-;2712::16;:20;:22::i;:::-;394:8145:4;;5939:280:30;6007:13;;;;;;;6006:14;5998:66;;;;-1:-1:-1;;;5998:66:30;;216:2:80;5998:66:30;;;198:21:80;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:80;;;338:37;392:19;;5998:66:30;;;;;;;;6078:12;;6094:15;6078:12;;;:31;6074:139;;6125:12;:30;;-1:-1:-1;;6125:30:30;6140:15;6125:30;;;;;;6174:28;;564:36:80;;;6174:28:30;;552:2:80;537:18;6174:28:30;;;;;;;6074:139;5939:280::o;422:184:80:-;394:8145:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405260043610610147575f3560e01c806372b6347b116100b3578063a86f9d9e1161006d578063a86f9d9e1461034a578063c19d93fb14610369578063c3f909d4146103fb578063e07baba614610445578063e30c397814610482578063f2fde38b1461049f575f80fd5b806372b6347b146102bb57806379ba5097146102db57806381e3925f146102ef5780638456cb59146103055780638abf6077146103195780638da5cb5b1461032d575f80fd5b80633f4ba83a116101045780633f4ba83a146102295780634f1ef2861461023d57806352d1902d146102505780635c975abb146102725780636b5ad7e014610292578063715018a6146102a7575f80fd5b806310f3ab1b1461014b5780633075db561461017f578063347258aa146101935780633659cfe6146101b45780633ab76e9f146101d35780633eb6b8cf1461020a575b5f80fd5b348015610156575f80fd5b5061016a610165366004611b6b565b6104be565b60405190151581526020015b60405180910390f35b34801561018a575f80fd5b5061016a61051f565b34801561019e575f80fd5b506101b26101ad366004611bf3565b610533565b005b3480156101bf575f80fd5b506101b26101ce366004611c31565b610788565b3480156101de575f80fd5b506097546101f2906001600160a01b031681565b6040516001600160a01b039091168152602001610176565b348015610215575f80fd5b506101f2610224366004611c6b565b61084f565b348015610234575f80fd5b506101b2610863565b6101b261024b366004611ca8565b610877565b34801561025b575f80fd5b50610264610930565b604051908152602001610176565b34801561027d575f80fd5b5061016a60c954610100900460ff1660021490565b34801561029d575f80fd5b5061026461708081565b3480156102b2575f80fd5b506101b26109e1565b6102ce6102c9366004611d90565b6109f2565b6040516101769190611ee0565b3480156102e6575f80fd5b506101b2610c4b565b3480156102fa575f80fd5b506102646202000081565b348015610310575f80fd5b506101b2610cc2565b348015610324575f80fd5b506101f2610cd5565b348015610338575f80fd5b506033546001600160a01b03166101f2565b348015610355575f80fd5b506101f2610364366004611f2e565b610ce3565b348015610374575f80fd5b5060fd5460fe546103b9916001600160401b0380821692600160401b8304821692600160801b8104831692600160c01b90910481169160ff8116916101009091041686565b604080516001600160401b03978816815295871660208701529386169385019390935290841660608401521515608083015290911660a082015260c001610176565b348015610406575f80fd5b5061040f610cf8565b6040805182516001600160401b0316815260208084015163ffffffff16908201529181015162ffffff1690820152606001610176565b348015610450575f80fd5b5060c95461046a906201000090046001600160401b031681565b6040516001600160401b039091168152602001610176565b34801561048d575f80fd5b506065546001600160a01b03166101f2565b3480156104aa575f80fd5b506101b26104b9366004611c31565b610d3c565b5f6001825f01516001600160401b03161115806104e35750602082015163ffffffff16155b806104f55750604082015162ffffff16155b8061050b575062020000826040015162ffffff16115b1561051757505f919050565b506001919050565b5f600261052a610dad565b60ff1614905090565b5f54610100900460ff161580801561055157505f54600160ff909116105b8061056a5750303b15801561056a57505f5460ff166001145b6105d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156105f3575f805461ff0019166101001790555b6105fd8484610dec565b5f610606610cf8565b9050610611816104be565b61064e5760405162461bcd60e51b815260206004820152600e60248201526d696e76616c696420636f6e66696760901b60448201526064016105c9565b60fd805467ffffffffffffffff60801b19426001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff19909316439190911617821716600160801b179091555f80805260fb6020527fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d89758581557fc88390e7e62175be0932452175b6a7222b6b094ab0ef984a5153c620345d897780546fffffffffffffffff000000000000000019169093179092556040517f68b82650828a9621868d09dc161400acbe189fa002e3fb7cf9dea5c2c6f928ee906107339087815260200190565b60405180910390a250508015610782575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036107d05760405162461bcd60e51b81526004016105c990611f5c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610802610e2b565b6001600160a01b0316146108285760405162461bcd60e51b81526004016105c990611fa8565b61083181610e46565b604080515f8082526020820190925261084c91839190610e4e565b50565b5f61085b848484610fb8565b949350505050565b61086b6110a9565b610875335f611139565b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036108bf5760405162461bcd60e51b81526004016105c990611f5c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166108f1610e2b565b6001600160a01b0316146109175760405162461bcd60e51b81526004016105c990611fa8565b61092082610e46565b61092c82826001610e4e565b5050565b5f306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109cf5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016105c9565b505f8051602061229583398151915290565b6109e961113d565b6108755f611197565b606060026109fe610dad565b60ff1603610a1f5760405163dfc60d8560e01b815260040160405180910390fd5b610a2960026111b0565b610a3d60c954610100900460ff1660021490565b15610a5b5760405163bae6e2a960e01b815260040160405180910390fd5b8115610ab057838214610ab05760405162461bcd60e51b815260206004820152601860248201527f6d69736d61746368656420706172616d73206c656e677468000000000000000060448201526064016105c9565b836001600160401b03811115610ac857610ac8611abe565b604051908082528060200260200182016040528015610b0157816020015b610aee611a43565b815260200190600190039081610ae65790505b5090505f5b84811015610c40578215610bba57610b98868683818110610b2957610b29611ff4565b9050602002810190610b3b9190612008565b868685818110610b4d57610b4d611ff4565b9050602002810190610b5f9190612008565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506111f892505050565b828281518110610baa57610baa611ff4565b6020026020010181905250610c13565b610bf5868683818110610bcf57610bcf611ff4565b9050602002810190610be19190612008565b60405180602001604052805f8152506111f8565b828281518110610c0757610c07611ff4565b60200260200101819052505b610c1b61156d565b610c38576040516306b7162d60e51b815260040160405180910390fd5b600101610b06565b5061085b60016111b0565b60655433906001600160a01b03168114610cb95760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016105c9565b61084c81611197565b610cca61161a565b610875336001611139565b5f610cde610e2b565b905090565b5f610cef468484610fb8565b90505b92915050565b604080516060810182525f8082526020820181905291810191909152506040805160608101825262028c60815262e4e1c060208201526201d4c09181019190915290565b610d4461113d565b606580546001600160a01b0383166001600160a01b03199091168117909155610d756033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f610db74661168b565b15610de257507fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5c90565b5060c95460ff1690565b806001600160a01b038116610e145760405163538ba4f960e01b815260040160405180910390fd5b610e1d836116b8565b610e2682611716565b505050565b5f80516020612295833981519152546001600160a01b031690565b61084c61113d565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610e8157610e2683611786565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610edb575060408051601f3d908101601f19168201909252610ed89181019061204a565b60015b610f3e5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016105c9565b5f805160206122958339815191528114610fac5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016105c9565b50610e26838383611821565b6097545f906001600160a01b031680610fe457604051638ed88b2560e01b815260040160405180910390fd5b604051630a3dc4f360e21b81526001600160401b0386166004820152602481018590526001600160a01b038216906328f713cc90604401602060405180830381865afa158015611036573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105a9190612061565b91508215801561107157506001600160a01b038216155b156110a157604051632b0d65db60e01b81526001600160401b0386166004820152602481018590526044016105c9565b509392505050565b6110bd60c954610100900460ff1660021490565b6110da5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461010069ffffffffffffffffff001990911662010000426001600160401b031602171790556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b61092c5b6033546001600160a01b031633146108755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105c9565b606580546001600160a01b031916905561084c81611845565b6111b94661168b565b156111e457807fa5054f728453d3dbe953bdc43e4d0cb97e662ea32d7958190f3dc2da31d9721b5d50565b60c9805460ff831660ff1990911617905550565b611200611a43565b5f611209610cf8565b90506112178486018661207c565b915081610140015163ffffffff164082606001511461126f5760405162461bcd60e51b81526020600482015260146024820152730929cac82989288be9862be84989e86969082a6960631b60448201526064016105c9565b81515f036112b65760405162461bcd60e51b81526020600482015260146024820152730929cac82989288be9864be84989e86969082a6960631b60448201526064016105c9565b806020015163ffffffff1682610120015163ffffffff161461130e5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d1d054d7d312535255607a1b60448201526064016105c9565b82516101c0830151151590151461135b5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d09313d097d554d151607a1b60448201526064016105c9565b816101c00151156113d15762020000826101a0015162ffffff1683610180015162ffffff1661138a919061216b565b11156113cc5760405162461bcd60e51b8152602060048201526011602482015270696e76616c696420626c6f622073697a6560781b60448201526064016105c9565b6114c4565b8251602084012060a0830151146114205760405162461bcd60e51b81526020600482015260136024820152720929cac82989288bea8b09892a6a8be9082a69606b1b60448201526064016105c9565b61018082015162ffffff161561146f5760405162461bcd60e51b81526020600482015260146024820152731253959053125117d516131254d517d4d510549560621b60448201526064016105c9565b825162ffffff16826101a0015162ffffff16146114c45760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f54584c4953545f53495a4560681b60448201526064016105c9565b806040015162ffffff16826101a0015162ffffff16111561151d5760405162461bcd60e51b8152602060048201526013602482015272696e76616c69642074786c6973742073697a6560681b60448201526064016105c9565b8161010001516001600160401b03167fbd2c05d5badfa6f80444e5b9b03b37e46106355960c43e72567a05c323213972838560405161155d9291906121d7565b60405180910390a2509392505050565b5f8061158f7173657175656e6365725f726567697374727960701b6001610ce3565b90506001600160a01b038116156116125760405163061caba560e21b81523360048201526001600160a01b03821690631872ae94906024016020604051808303815f875af11580156115e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116079190612201565b611612575f91505090565b600191505090565b61162e60c954610100900460ff1660021490565b1561164c5760405163bae6e2a960e01b815260040160405180910390fd5b60c9805461ff0019166102001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589060200161112f565b5f600182148061169c575061426882145b806116a9575062aa36a782145b80610cf25750610cf282611896565b5f54610100900460ff166116de5760405162461bcd60e51b81526004016105c99061221c565b6116e66118ad565b6117046001600160a01b038216156116fe5781611197565b33611197565b5060c9805461ff001916610100179055565b5f54610100900460ff1661173c5760405162461bcd60e51b81526004016105c99061221c565b6001600160401b034611156117645760405163a12e8fa960e01b815260040160405180910390fd5b609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381163b6117f35760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016105c9565b5f8051602061229583398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61182a836118d3565b5f825111806118365750805b15610e26576107828383611912565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f617e2c8210158015610cf2575050617e90101590565b5f54610100900460ff166108755760405162461bcd60e51b81526004016105c99061221c565b6118dc81611786565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b6060610cef83836040518060600160405280602781526020016122b56027913960605f80856001600160a01b03168560405161194e9190612267565b5f60405180830381855af49150503d805f8114611986576040519150601f19603f3d011682016040523d82523d5f602084013e61198b565b606091505b509150915061199c868383876119a6565b9695505050505050565b60608315611a145782515f03611a0d576001600160a01b0385163b611a0d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105c9565b508161085b565b61085b8383815115611a295781518083602001fd5b8060405162461bcd60e51b81526004016105c99190612282565b604080516101e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915290565b634e487b7160e01b5f52604160045260245ffd5b6040516101e081016001600160401b0381118282101715611af557611af5611abe565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611b2357611b23611abe565b604052919050565b80356001600160401b0381168114611b41575f80fd5b919050565b803563ffffffff81168114611b41575f80fd5b803562ffffff81168114611b41575f80fd5b5f60608284031215611b7b575f80fd5b604051606081018181106001600160401b0382111715611b9d57611b9d611abe565b604052611ba983611b2b565b8152611bb760208401611b46565b6020820152611bc860408401611b59565b60408201529392505050565b6001600160a01b038116811461084c575f80fd5b8035611b4181611bd4565b5f805f60608486031215611c05575f80fd5b8335611c1081611bd4565b92506020840135611c2081611bd4565b929592945050506040919091013590565b5f60208284031215611c41575f80fd5b8135611c4c81611bd4565b9392505050565b801515811461084c575f80fd5b8035611b4181611c53565b5f805f60608486031215611c7d575f80fd5b611c8684611b2b565b9250602084013591506040840135611c9d81611c53565b809150509250925092565b5f8060408385031215611cb9575f80fd5b8235611cc481611bd4565b91506020838101356001600160401b0380821115611ce0575f80fd5b818601915086601f830112611cf3575f80fd5b813581811115611d0557611d05611abe565b611d17601f8201601f19168501611afb565b91508082528784828501011115611d2c575f80fd5b80848401858401375f848284010152508093505050509250929050565b5f8083601f840112611d59575f80fd5b5081356001600160401b03811115611d6f575f80fd5b6020830191508360208260051b8501011115611d89575f80fd5b9250929050565b5f805f8060408587031215611da3575f80fd5b84356001600160401b0380821115611db9575f80fd5b611dc588838901611d49565b90965094506020870135915080821115611ddd575f80fd5b50611dea87828801611d49565b95989497509550505050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e0810151611e5060e08401826001600160a01b03169052565b50610100818101516001600160401b0381168483015250506101208181015163ffffffff81168483015250506101408181015163ffffffff8116848301525050610160818101516001600160401b0381168483015250506101808181015162ffffff81168483015250506101a08181015162ffffff81168483015250506101c08181015180151584830152610782565b602080825282518282018190525f9190848201906040850190845b81811015611f2257611f0e838551611df6565b928401926101e09290920191600101611efb565b50909695505050505050565b5f8060408385031215611f3f575f80fd5b823591506020830135611f5181611c53565b809150509250929050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e1984360301811261201d575f80fd5b8301803591506001600160401b03821115612036575f80fd5b602001915036819003821315611d89575f80fd5b5f6020828403121561205a575f80fd5b5051919050565b5f60208284031215612071575f80fd5b8151611c4c81611bd4565b5f6101e0828403121561208d575f80fd5b612095611ad2565b823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c08201526120e160e08401611be8565b60e08201526101006120f4818501611b2b565b90820152610120612106848201611b46565b90820152610140612118848201611b46565b9082015261016061212a848201611b2b565b9082015261018061213c848201611b59565b908201526101a061214e848201611b59565b908201526101c0612160848201611c60565b908201529392505050565b80820180821115610cf257634e487b7160e01b5f52601160045260245ffd5b5f5b838110156121a457818101518382015260200161218c565b50505f910152565b5f81518084526121c381602086016020860161218a565b601f01601f19169290920160200192915050565b5f6102006121e58386611df6565b806101e08401526121f8818401856121ac565b95945050505050565b5f60208284031215612211575f80fd5b8151611c4c81611c53565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f825161227881846020870161218a565b9190910192915050565b602081525f610cef60208301846121ac56fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ee1e2d5e19fd22ee86db42e3f8fe483b9471d6010437fee30198d9eebc69e46c64736f6c63430008180033","sourceMap":"394:8145:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7650:348;;;;;;;;;;-1:-1:-1;7650:348:4;;;;;:::i;:::-;;:::i;:::-;;;2042:14:80;;2035:22;2017:41;;2005:2;1990:18;7650:348:4;;;;;;;;3558:104:16;;;;;;;;;;;;;:::i;984:743:4:-;;;;;;;;;;-1:-1:-1;984:743:4;;;;;:::i;:::-;;:::i;:::-;;3143:195:53;;;;;;;;;;-1:-1:-1;3143:195:53;;;;;:::i;:::-;;:::i;453:29:15:-;;;;;;;;;;-1:-1:-1;453:29:15;;;;-1:-1:-1;;;;;453:29:15;;;;;;-1:-1:-1;;;;;3330:32:80;;;3312:51;;3300:2;3285:18;453:29:15;3166:203:80;1844:253:15;;;;;;;;;;-1:-1:-1;1844:253:15;;;;;:::i;:::-;;:::i;3031:207:16:-;;;;;;;;;;;;;:::i;3657:220:53:-;;;;;;:::i;:::-;;:::i;2762:131::-;;;;;;;;;;;;;:::i;:::-;;;5289:25:80;;;5277:2;5262:18;2762:131:53;5143:177:80;3466:86:16;;;;;;;;;;;;3528:8;;;;;:17;:8;521:1;3528:17;;3466:86;503:61:4;;;;;;;;;;;;557:7;503:61;;2085:101:25;;;;;;;;;;;;;:::i;1781:947:4:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2031:212:24:-;;;;;;;;;;;;;:::i;685:54:4:-;;;;;;;;;;;;730:9;685:54;;2784:202:16;;;;;;;;;;;;;:::i;3244:90::-;;;;;;;;;;;;;:::i;1462:85:25:-;;;;;;;;;;-1:-1:-1;1534:6:25;;-1:-1:-1;;;;;1534:6:25;1462:85;;1560:241:15;;;;;;;;;;-1:-1:-1;1560:241:15;;;;;:::i;:::-;;:::i;746:28:4:-;;;;;;;;;;-1:-1:-1;746:28:4;;;;;;-1:-1:-1;;;;;746:28:4;;;;-1:-1:-1;;;746:28:4;;;;;-1:-1:-1;;;746:28:4;;;;;-1:-1:-1;;;746:28:4;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9846:15:80;;;9828:34;;9898:15;;;9893:2;9878:18;;9871:43;9950:15;;;9930:18;;;9923:43;;;;10002:15;;;9997:2;9982:18;;9975:43;10062:14;10055:22;10049:3;10034:19;;10027:51;10115:15;;;10109:3;10094:19;;10087:44;9778:3;9763:19;746:28:4;9520:617:80;7131:513:4;;;;;;;;;;;;;:::i;:::-;;;;10356:13:80;;-1:-1:-1;;;;;10352:38:80;10334:57;;10451:4;10439:17;;;10433:24;10459:10;10429:41;10407:20;;;10400:71;10519:17;;;10513:24;10539:8;10509:39;10487:20;;;10480:69;10322:2;10307:18;7131:513:4;10142:413:80;1105:28:16;;;;;;;;;;-1:-1:-1;1105:28:16;;;;;;;-1:-1:-1;;;;;1105:28:16;;;;;;-1:-1:-1;;;;;10722:31:80;;;10704:50;;10692:2;10677:18;1105:28:16;10560:200:80;1144:99:24;;;;;;;;;;-1:-1:-1;1223:13:24;;-1:-1:-1;;;;;1223:13:24;1144:99;;1436:178;;;;;;;;;;-1:-1:-1;1436:178:24;;;;;:::i;:::-;;:::i;7650:348:4:-;7726:4;7777:1;7759:6;:14;;;-1:-1:-1;;;;;7759:19:4;;;:70;;;-1:-1:-1;7801:23:4;;;;:28;;;7759:70;:105;;;-1:-1:-1;7833:26:4;;;;:31;;;7759:105;:164;;;;7913:10;7884:6;:26;;;:39;;;7759:164;7742:227;;;-1:-1:-1;7964:5:4;;7650:348;-1:-1:-1;7650:348:4:o;7742:227::-;-1:-1:-1;7987:4:4;;7650:348;-1:-1:-1;7650:348:4:o;3558:104:16:-;3605:4;521:1;3628:18;:16;:18::i;:::-;:27;;;3621:34;;3558:104;:::o;984:743:4:-;3279:19:30;3302:13;;;;;;3301:14;;3347:34;;;;-1:-1:-1;3365:12:30;;3380:1;3365:12;;;;:16;3347:34;3346:108;;;-1:-1:-1;3426:4:30;1713:19:37;:23;;;3387:66:30;;-1:-1:-1;3436:12:30;;;;;:17;3387:66;3325:201;;;;-1:-1:-1;;;3325:201:30;;10967:2:80;3325:201:30;;;10949:21:80;11006:2;10986:18;;;10979:30;11045:34;11025:18;;;11018:62;-1:-1:-1;;;11096:18:80;;;11089:44;11150:19;;3325:201:30;;;;;;;;;3536:12;:16;;-1:-1:-1;;3536:16:30;3551:1;3536:16;;;3562:65;;;;3596:13;:20;;-1:-1:-1;;3596:20:30;;;;;3562:65;1147:41:4::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:4;;11382:2:80;1253:48:4::1;::::0;::::1;11364:21:80::0;11421:2;11401:18;;;11394:30;-1:-1:-1;;;11440:18:80;;;11433:44;11494:18;;1253:48:4::1;11180:338:80::0;1253:48:4::1;1334:19:::0;:42;;-1:-1:-1;;;;1418:15:4::1;-1:-1:-1::0;;;;;1386:48:4;;::::1;-1:-1:-1::0;;;1386:48:4::1;-1:-1:-1::0;;1386:48:4;;;1363:12:::1;1334:42:::0;;;::::1;1386:48:::0;;::::1;1444:19;-1:-1:-1::0;;;1444:19:4::1;::::0;;;1334::::1;1538:15:::0;;;1334:5:::1;1538:15;::::0;;1563:33;;;1606:13;:39;;-1:-1:-1;;1606:39:4::1;::::0;;::::1;::::0;;;1538:15;1661:59;::::1;::::0;::::1;::::0;1579:17;5289:25:80;;5277:2;5262:18;;5143:177;1661:59:4::1;;;;;;;;1137:590;;3651:14:30::0;3647:99;;;3697:5;3681:21;;-1:-1:-1;;3681:21:30;;;3721:14;;-1:-1:-1;11675:36:80;;3721:14:30;;11663:2:80;11648:18;3721:14:30;;;;;;;3647:99;3269:483;984:743:4;;;:::o;3143:195:53:-;-1:-1:-1;;;;;1654:6:53;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:53;;;;;;;:::i;:::-;1751:6;-1:-1:-1;;;;;1727:30:53;:20;:18;:20::i;:::-;-1:-1:-1;;;;;1727:30:53;;1719:87;;;;-1:-1:-1;;;1719:87:53;;;;;;;:::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:15:-;2008:15;2046:44;2055:8;2065:5;2072:17;2046:8;:44::i;:::-;2039:51;1844:253;-1:-1:-1;;;;1844:253:15:o;3031:207:16:-;3075:10;:8;:10::i;:::-;3197:34;3213:10;3225:5;3197:15;:34::i;:::-;3031:207::o;3657:220:53:-;-1:-1:-1;;;;;1654:6:53;1637:23;1645:4;1637:23;1629:80;;;;-1:-1:-1;;;1629:80:53;;;;;;;:::i;:::-;1751:6;-1:-1:-1;;;;;1727:30:53;:20;:18;:20::i;:::-;-1:-1:-1;;;;;1727:30:53;;1719:87;;;;-1:-1:-1;;;1719:87:53;;;;;;;:::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:53;2072:23;;2064:92;;;;-1:-1:-1;;;2064:92:53;;12750:2:80;2064:92:53;;;12732:21:80;12789:2;12769:18;;;12762:30;12828:34;12808:18;;;12801:62;12899:26;12879:18;;;12872:54;12943:19;;2064:92:53;12548:420:80;2064:92:53;-1:-1:-1;;;;;;;;;;;;2762:131:53;:::o;2085:101:25:-;1355:13;:11;:13::i;:::-;2149:30:::1;2176:1;2149:18;:30::i;1781:947:4:-:0;1967:40;521:1:16;2064:18;:16;:18::i;:::-;:27;;;2060:56;;2100:16;;-1:-1:-1;;;2100:16:16;;;;;;;;;;;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:16::1;;;;;;;;;;;2344:43;2027:19:4::0;;2023:116:::2;;2070:29:::0;;::::2;2062:66;;;::::0;-1:-1:-1;;;2062:66:4;;13175:2:80;2062:66:4::2;::::0;::::2;13157:21:80::0;13214:2;13194:18;;;13187:30;13253:26;13233:18;;;13226:54;13297:18;;2062:66:4::2;12973:348:80::0;2062:66:4::2;2189:4:::0;-1:-1:-1;;;;;2159:42:4;::::2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2149:52;;2216:9;2211:511;2231:15:::0;;::::2;2211:511;;;2271:19:::0;;2267:287:::2;;2386:34;2400:4;;2405:1;2400:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2409;;2417:1;2409:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2386:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;2386:13:4::2;::::0;-1:-1:-1;;;2386:34:4:i:2;:::-;2373:7;2381:1;2373:10;;;;;;;;:::i;:::-;;;;;;:47;;;;2267:287;;;2506:33;2520:4;;2525:1;2520:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2529:9;;;;;;;;;;;::::0;2506:13:::2;:33::i;:::-;2493:7;2501:1;2493:10;;;;;;;;:::i;:::-;;;;;;:46;;;;2267:287;2627:22;:20;:22::i;:::-;2622:90;;2676:21;;-1:-1:-1::0;;;2676:21:4::2;;;;;;;;;;;2622:90;2248:3;;2211:511;;;;2171:25:16::0;482:1;2171:17;:25::i;2031:212:24:-;1223:13;;965:10:38;;-1:-1:-1;;;;;1223:13:24;2130:24;;2122:78;;;;-1:-1:-1;;;2122:78:24;;14186:2:80;2122:78:24;;;14168:21:80;14225:2;14205:18;;;14198:30;14264:34;14244:18;;;14237:62;-1:-1:-1;;;14315:18:80;;;14308:39;14364:19;;2122:78:24;13984:405:80;2122:78:24;2210:26;2229:6;2210:18;:26::i;2784:202:16:-;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:15:-;1699:15;1737:57;1753:13;1769:5;1776:17;1737:8;:57::i;:::-;1730:64;;1560:241;;;;;:::o;7131:513:4:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;7223:414:4;;;;;;;;7263:7;7223:414;;7401:10;7223:414;;;;7619:7;7223:414;;;;;;;;7131:513::o;1436:178:24:-;1355:13:25;:11;:13::i;:::-;1525::24::1;:24:::0;;-1:-1:-1;;;;;1525:24:24;::::1;-1:-1:-1::0;;;;;;1525:24:24;;::::1;::::0;::::1;::::0;;;1589:7:::1;1534:6:25::0;;-1:-1:-1;;;;;1534:6:25;;1462:85;1589:7:24::1;-1:-1:-1::0;;;;;1564:43:24::1;;;;;;;;;;;1436:178:::0;:::o;5115:288:16:-;5174:14;5204:43;5233:13;5204:28;:43::i;:::-;5200:197;;;-1:-1:-1;5308:13:16;5302:20;2762:131:53;:::o;5200:197:16:-;-1:-1:-1;5377:9:16;;;;5115:288;:::o;3884:237::-;4010:15;-1:-1:-1;;;;;2461:19:16;;2457:46;;2489:14;;-1:-1:-1;;;2489:14:16;;;;;;;;;;;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:50:-;-1:-1:-1;;;;;;;;;;;1254:54:50;-1:-1:-1;;;;;1254:54:50;;1175:140::o;4619:75:16:-;1355:13:25;:11;:13::i;2494:922:50:-;689:66;2910:48;;;2906:504;;;2974:37;2993:17;2974:18;:37::i;2906:504::-;3064:17;-1:-1:-1;;;;;3046:50:50;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3046:52:50;;;;;;;;-1:-1:-1;;3046:52:50;;;;;;;;;;;;:::i;:::-;;;3042:291;;3262:56;;-1:-1:-1;;;3262:56:50;;14785:2:80;3262:56:50;;;14767:21:80;14824:2;14804:18;;;14797:30;14863:34;14843:18;;;14836:62;-1:-1:-1;;;14914:18:80;;;14907:44;14968:19;;3262:56:50;14583:410:80;3042:291:50;-1:-1:-1;;;;;;;;;;;3148:28:50;;3140:82;;;;-1:-1:-1;;;3140:82:50;;15200:2:80;3140:82:50;;;15182:21:80;15239:2;15219:18;;;15212:30;15278:34;15258:18;;;15251:62;-1:-1:-1;;;15329:18:80;;;15322:39;15378:19;;3140:82:50;14998:405:80;3140:82:50;3099:138;3346:53;3364:17;3383:4;3389:9;3346:17;:53::i;2864:524:15:-;3077:14;;3014:21;;-1:-1:-1;;;;;3077:14:15;;3101:68;;3143:26;;-1:-1:-1;;;3143:26:15;;;;;;;;;;;3101:68;3196:60;;-1:-1:-1;;;3196:60:15;;-1:-1:-1;;;;;15598:31:80;;3196:60:15;;;15580:50:80;15646:18;;;15639:34;;;-1:-1:-1;;;;;3196:43:15;;;;;15553:18:80;;3196:60:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3180:77;;3273:17;3272:18;:41;;;;-1:-1:-1;;;;;;3294:19:15;;;3272:41;3268:114;;;3336:35;;-1:-1:-1;;;3336:35:15;;-1:-1:-1;;;;;15598:31:80;;3336:35:15;;;15580:50:80;15646:18;;;15639:34;;;15553:18;;3336:35:15;15408:271:80;3268:114:15;3041:347;2864:524;;;;;:::o;4454:159:16:-;2246:8;3528;;;;;:17;:8;521:1;3528:17;;3466:86;2246:8;2241:44;;2263:22;;-1:-1:-1;;;2263:22:16;;;;;;;;;;;2241:44;4504:8:::1;:17:::0;;::::1;-1:-1:-1::0;;4531:40:16;;;;4555:15:::1;-1:-1:-1::0;;;;;4531:40:16::1;;::::0;;;;4586:20:::1;::::0;4595:10:::1;3312:51:80::0;;4586:20:16::1;::::0;3300:2:80;3285:18;4586:20:16::1;;;;;;;;4454:159::o:0;4700:70::-;1355:13:25;1620:130;1534:6;;-1:-1:-1;;;;;1534:6:25;965:10:38;1683:23:25;1675:68;;;;-1:-1:-1;;;1675:68:25;;16142:2:80;1675:68:25;;;16124:21:80;;;16161:18;;;16154:30;16220:34;16200:18;;;16193:62;16272:18;;1675:68:25;15940:356:80;1798:153:24;1887:13;1880:20;;-1:-1:-1;;;;;;1880:20:24;;;1910:34;1935:8;1910:24;:34::i;4807:272:16:-;4881:43;4910:13;4881:28;:43::i;:::-;4877:196;;;4989:8;4974:13;4967:31;3143:195:53;:::o;4877:196:16:-;5042:9;:20;;;;;-1:-1:-1;;5042:20:16;;;;;;4807:272;:::o;2974:3693:4:-;3094:37;;:::i;:::-;3147:30;3180:11;:9;:11::i;:::-;3147:44;-1:-1:-1;3244:43:4;;;;3255:4;3244:43;:::i;:::-;3235:52;;3435:6;:25;;;3425:36;;;3408:6;:13;;;:53;3400:86;;;;-1:-1:-1;;;3400:86:4;;17903:2:80;3400:86:4;;;17885:21:80;17942:2;17922:18;;;17915:30;-1:-1:-1;;;17961:18:80;;;17954:50;18021:18;;3400:86:4;17701:344:80;3400:86:4;3504:16;;;:23;3496:56;;;;-1:-1:-1;;;3496:56:4;;18252:2:80;3496:56:4;;;18234:21:80;18291:2;18271:18;;;18264:30;-1:-1:-1;;;18310:18:80;;;18303:50;18370:18;;3496:56:4;18050:344:80;3496:56:4;3697:6;:23;;;3678:42;;:6;:15;;;:42;;;3670:72;;;;-1:-1:-1;;;3670:72:4;;18601:2:80;3670:72:4;;;18583:21:80;18640:2;18620:18;;;18613:30;-1:-1:-1;;;18659:18:80;;;18652:47;18716:18;;3670:72:4;18399:341:80;3670:72:4;3781:13;;3761:15;;;;:39;;3781:18;;3761:39;3753:69;;;;-1:-1:-1;;;3753:69:4;;18947:2:80;3753:69:4;;;18929:21:80;18986:2;18966:18;;;18959:30;-1:-1:-1;;;19005:18:80;;;18998:47;19062:18;;3753:69:4;18745:341:80;3753:69:4;3862:6;:15;;;3858:728;;;730:9;4215:6;:21;;;4180:56;;4188:6;:23;;;4180:32;;:56;;;;:::i;:::-;:78;;4155:154;;;;-1:-1:-1;;;4155:154:4;;19520:2:80;4155:154:4;;;19502:21:80;19559:2;19539:18;;;19532:30;-1:-1:-1;;;19578:18:80;;;19571:47;19635:18;;4155:154:4;19318:341:80;4155:154:4;3858:728;;;4367:17;;;;;;4348:15;;;;:36;4340:68;;;;-1:-1:-1;;;4340:68:4;;19866:2:80;4340:68:4;;;19848:21:80;19905:2;19885:18;;;19878:30;-1:-1:-1;;;19924:18:80;;;19917:49;19983:18;;4340:68:4;19664:343:80;4340:68:4;4430:23;;;;:28;;;4422:61;;;;-1:-1:-1;;;4422:61:4;;20214:2:80;4422:61:4;;;20196:21:80;20253:2;20233:18;;;20226:30;-1:-1:-1;;;20272:18:80;;;20265:50;20332:18;;4422:61:4;20012:344:80;4422:61:4;4537:6;:13;4505:46;;:6;:21;;;:46;;;4497:78;;;;-1:-1:-1;;;4497:78:4;;20563:2:80;4497:78:4;;;20545:21:80;20602:2;20582:18;;;20575:30;-1:-1:-1;;;20621:18:80;;;20614:49;20680:18;;4497:78:4;20361:343:80;4497:78:4;4708:6;:26;;;4683:51;;:6;:21;;;:51;;;;4675:83;;;;-1:-1:-1;;;4675:83:4;;20911:2:80;4675:83:4;;;20893:21:80;20950:2;20930:18;;;20923:30;-1:-1:-1;;;20969:18:80;;;20962:49;21028:18;;4675:83:4;20709:343:80;4675:83:4;6607:6;:20;;;-1:-1:-1;;;;;6582:78:4;;6635:6;6651;6582:78;;;;;;;:::i;:::-;;;;;;;;3137:3530;2974:3693;;;;;:::o;8036:501::-;8085:4;8215:36;8285:35;-1:-1:-1;;;8315:4:4;8285:7;:35::i;:::-;8215:106;-1:-1:-1;;;;;;8335:51:4;;;8331:179;;8407:46;;-1:-1:-1;;;8407:46:4;;8442:10;8407:46;;;3312:51:80;-1:-1:-1;;;;;8407:34:4;;;;;3285:18:80;;8407:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8402:98;;8480:5;8473:12;;;8036:501;:::o;8402:98::-;8526:4;8519:11;;;8036:501;:::o;4341:107:16:-;2348:8;3528;;;;;:17;:8;521:1;3528:17;;3466:86;2348:8;2344:43;;;2365:22;;-1:-1:-1;;;2365:22:16;;;;;;;;;;;2344:43;4392:8:::1;:16:::0;;-1:-1:-1;;4392:16:16::1;::::0;::::1;::::0;;4423:18:::1;::::0;4430:10:::1;3312:51:80::0;;4423:18:16::1;::::0;3300:2:80;3285:18;4423::16::1;3166:203:80::0;2377:235:21;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:16:-;5374:13:30;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:30;;;;;;;:::i;:::-;4213:16:16::1;:14;:16::i;:::-;4239:62;-1:-1:-1::0;;;;;4258:20:16;::::1;::::0;:42:::1;;4294:6;4239:18;:62::i;4258:42::-;4281:10;4239:18;:62::i;:::-;-1:-1:-1::0;4311:8:16::1;:17:::0;;-1:-1:-1;;4311:17:16::1;;;::::0;;4127:208::o;2241:248:15:-;5374:13:30;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:30;;;;;;;:::i;:::-;-1:-1:-1;;;;;2346:13:15::1;:32;2342:99;;;2401:29;;-1:-1:-1::0;;;2401:29:15::1;;;;;;;;;;;2342:99;2450:14;:32:::0;;-1:-1:-1;;;;;;2450:32:15::1;-1:-1:-1::0;;;;;2450:32:15;;;::::1;::::0;;;::::1;::::0;;2241:248::o;1406:259:50:-;-1:-1:-1;;;;;1713:19:37;;;1479:95:50;;;;-1:-1:-1;;;1479:95:50;;22852:2:80;1479:95:50;;;22834:21:80;22891:2;22871:18;;;22864:30;22930:34;22910:18;;;22903:62;-1:-1:-1;;;22981:18:80;;;22974:43;23034:19;;1479:95:50;22650:409:80;1479:95:50;-1:-1:-1;;;;;;;;;;;1584:74:50;;-1:-1:-1;;;;;;1584:74:50;-1:-1:-1;;;;;1584:74:50;;;;;;;;;;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:25:-;2779:6;;;-1:-1:-1;;;;;2795:17:25;;;-1:-1:-1;;;;;;2795:17:25;;;;;;;2827:40;;2779:6;;;2795:17;2779:6;;2827:40;;2760:16;;2827:40;2750:124;2687:187;:::o;2003:134:21:-;2067:4;2102:6;2090:8;:18;;:40;;;;-1:-1:-1;;2124:6:21;-1:-1:-1;2112:18:21;;2003:134::o;747:59:38:-;5374:13:30;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:30;;;;;;;:::i;1771:152:50:-;1837:37;1856:17;1837:18;:37::i;:::-;1889:27;;-1:-1:-1;;;;;1889:27:50;;;;;;;;1771:152;:::o;6674:198:54:-;6757:12;6788:77;6809:6;6817:4;6788:77;;;;;;;;;;;;;;;;;7199:12;7224;7238:23;7265:6;-1:-1:-1;;;;;7265:19:54;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:54:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1713:19:37;;;8113:60:54;;;;-1:-1:-1;;;8113:60:54;;23558:2:80;8113:60:54;;;23540:21:80;23597:2;23577:18;;;23570:30;23636:31;23616:18;;;23609:59;23685:18;;8113:60:54;23356:353:80;8113:60:54;-1:-1:-1;8208:10:54;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:54;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:127:80:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:252;218:2;212:9;260:3;248:16;;-1:-1:-1;;;;;279:34:80;;315:22;;;276:62;273:88;;;341:18;;:::i;:::-;377:2;370:22;146:252;:::o;403:275::-;474:2;468:9;539:2;520:13;;-1:-1:-1;;516:27:80;504:40;;-1:-1:-1;;;;;559:34:80;;595:22;;;556:62;553:88;;;621:18;;:::i;:::-;657:2;650:22;403:275;;-1:-1:-1;403:275:80:o;683:171::-;750:20;;-1:-1:-1;;;;;799:30:80;;789:41;;779:69;;844:1;841;834:12;779:69;683:171;;;:::o;859:163::-;926:20;;986:10;975:22;;965:33;;955:61;;1012:1;1009;1002:12;1027:161;1094:20;;1154:8;1143:20;;1133:31;;1123:59;;1178:1;1175;1168:12;1193:583;1275:6;1328:2;1316:9;1307:7;1303:23;1299:32;1296:52;;;1344:1;1341;1334:12;1296:52;1377:2;1371:9;1419:2;1411:6;1407:15;1488:6;1476:10;1473:22;-1:-1:-1;;;;;1440:10:80;1437:34;1434:62;1431:88;;;1499:18;;:::i;:::-;1535:2;1528:22;1574:28;1592:9;1574:28;:::i;:::-;1566:6;1559:44;1636:37;1669:2;1658:9;1654:18;1636:37;:::i;:::-;1631:2;1623:6;1619:15;1612:62;1707:37;1740:2;1729:9;1725:18;1707:37;:::i;:::-;1702:2;1690:15;;1683:62;1694:6;1193:583;-1:-1:-1;;;1193:583:80:o;2069:131::-;-1:-1:-1;;;;;2144:31:80;;2134:42;;2124:70;;2190:1;2187;2180:12;2205:134;2273:20;;2302:31;2273:20;2302:31;:::i;2344:456::-;2421:6;2429;2437;2490:2;2478:9;2469:7;2465:23;2461:32;2458:52;;;2506:1;2503;2496:12;2458:52;2545:9;2532:23;2564:31;2589:5;2564:31;:::i;:::-;2614:5;-1:-1:-1;2671:2:80;2656:18;;2643:32;2684:33;2643:32;2684:33;:::i;:::-;2344:456;;2736:7;;-1:-1:-1;;;2790:2:80;2775:18;;;;2762:32;;2344:456::o;2805:247::-;2864:6;2917:2;2905:9;2896:7;2892:23;2888:32;2885:52;;;2933:1;2930;2923:12;2885:52;2972:9;2959:23;2991:31;3016:5;2991:31;:::i;:::-;3041:5;2805:247;-1:-1:-1;;;2805:247:80:o;3374:118::-;3460:5;3453:13;3446:21;3439:5;3436:32;3426:60;;3482:1;3479;3472:12;3497:128;3562:20;;3591:28;3562:20;3591:28;:::i;3630:381::-;3703:6;3711;3719;3772:2;3760:9;3751:7;3747:23;3743:32;3740:52;;;3788:1;3785;3778:12;3740:52;3811:28;3829:9;3811:28;:::i;:::-;3801:38;;3886:2;3875:9;3871:18;3858:32;3848:42;;3940:2;3929:9;3925:18;3912:32;3953:28;3975:5;3953:28;:::i;:::-;4000:5;3990:15;;;3630:381;;;;;:::o;4240:898::-;4317:6;4325;4378:2;4366:9;4357:7;4353:23;4349:32;4346:52;;;4394:1;4391;4384:12;4346:52;4433:9;4420:23;4452:31;4477:5;4452:31;:::i;:::-;4502:5;-1:-1:-1;4526:2:80;4564:18;;;4551:32;-1:-1:-1;;;;;4632:14:80;;;4629:34;;;4659:1;4656;4649:12;4629:34;4697:6;4686:9;4682:22;4672:32;;4742:7;4735:4;4731:2;4727:13;4723:27;4713:55;;4764:1;4761;4754:12;4713:55;4800:2;4787:16;4822:2;4818;4815:10;4812:36;;;4828:18;;:::i;:::-;4870:53;4913:2;4894:13;;-1:-1:-1;;4890:27:80;4886:36;;4870:53;:::i;:::-;4857:66;;4946:2;4939:5;4932:17;4986:7;4981:2;4976;4972;4968:11;4964:20;4961:33;4958:53;;;5007:1;5004;4997:12;4958:53;5062:2;5057;5053;5049:11;5044:2;5037:5;5033:14;5020:45;5106:1;5101:2;5096;5089:5;5085:14;5081:23;5074:34;;5127:5;5117:15;;;;;4240:898;;;;;:::o;5507:374::-;5577:8;5587:6;5641:3;5634:4;5626:6;5622:17;5618:27;5608:55;;5659:1;5656;5649:12;5608:55;-1:-1:-1;5682:20:80;;-1:-1:-1;;;;;5714:30:80;;5711:50;;;5757:1;5754;5747:12;5711:50;5794:4;5786:6;5782:17;5770:29;;5854:3;5847:4;5837:6;5834:1;5830:14;5822:6;5818:27;5814:38;5811:47;5808:67;;;5871:1;5868;5861:12;5808:67;5507:374;;;;;:::o;5886:809::-;6030:6;6038;6046;6054;6107:2;6095:9;6086:7;6082:23;6078:32;6075:52;;;6123:1;6120;6113:12;6075:52;6163:9;6150:23;-1:-1:-1;;;;;6233:2:80;6225:6;6222:14;6219:34;;;6249:1;6246;6239:12;6219:34;6288:77;6357:7;6348:6;6337:9;6333:22;6288:77;:::i;:::-;6384:8;;-1:-1:-1;6262:103:80;-1:-1:-1;6472:2:80;6457:18;;6444:32;;-1:-1:-1;6488:16:80;;;6485:36;;;6517:1;6514;6507:12;6485:36;;6556:79;6627:7;6616:8;6605:9;6601:24;6556:79;:::i;:::-;5886:809;;;;-1:-1:-1;6654:8:80;-1:-1:-1;;;;5886:809:80:o;7003:1472::-;7088:5;7082:12;7077:3;7070:25;7144:4;7137:5;7133:16;7127:23;7120:4;7115:3;7111:14;7104:47;7200:4;7193:5;7189:16;7183:23;7176:4;7171:3;7167:14;7160:47;7256:4;7249:5;7245:16;7239:23;7232:4;7227:3;7223:14;7216:47;7312:4;7305:5;7301:16;7295:23;7288:4;7283:3;7279:14;7272:47;7368:4;7361:5;7357:16;7351:23;7344:4;7339:3;7335:14;7328:47;7424:4;7417:5;7413:16;7407:23;7400:4;7395:3;7391:14;7384:47;7477:4;7470:5;7466:16;7460:23;7492:48;7534:4;7529:3;7525:14;7511:12;-1:-1:-1;;;;;3123:31:80;3111:44;;3057:104;7492:48;-1:-1:-1;7559:6:80;7602:14;;;7596:21;-1:-1:-1;;;;;6765:30:80;;7660:12;;;6753:43;-1:-1:-1;;7692:6:80;7735:14;;;7729:21;6883:10;6872:22;;7793:12;;;6860:35;-1:-1:-1;;7825:6:80;7868:14;;;7862:21;6883:10;6872:22;;7926:12;;;6860:35;-1:-1:-1;;7958:6:80;8001:14;;;7995:21;-1:-1:-1;;;;;6765:30:80;;8059:12;;;6753:43;-1:-1:-1;;8091:6:80;8134:14;;;8128:21;6982:8;6971:20;;8192:12;;;6959:33;-1:-1:-1;;8224:6:80;8267:14;;;8261:21;6982:8;6971:20;;8325:12;;;6959:33;-1:-1:-1;;8357:6:80;8400:14;;;8394:21;1851:13;;1844:21;8456:12;;;1832:34;8424:45;1781:91;8480:721;8711:2;8763:21;;;8833:13;;8736:18;;;8855:22;;;8682:4;;8711:2;8934:15;;;;8908:2;8893:18;;;8682:4;8977:198;8991:6;8988:1;8985:13;8977:198;;;9040:51;9087:3;9078:6;9072:13;9040:51;:::i;:::-;9150:15;;;;9120:6;9111:16;;;;;9013:1;9006:9;8977:198;;;-1:-1:-1;9192:3:80;;8480:721;-1:-1:-1;;;;;;8480:721:80:o;9206:309::-;9271:6;9279;9332:2;9320:9;9311:7;9307:23;9303:32;9300:52;;;9348:1;9345;9338:12;9300:52;9384:9;9371:23;9361:33;;9444:2;9433:9;9429:18;9416:32;9457:28;9479:5;9457:28;:::i;:::-;9504:5;9494:15;;;9206:309;;;;;:::o;11722:408::-;11924:2;11906:21;;;11963:2;11943:18;;;11936:30;12002:34;11997:2;11982:18;;11975:62;-1:-1:-1;;;12068:2:80;12053:18;;12046:42;12120:3;12105:19;;11722:408::o;12135:::-;12337:2;12319:21;;;12376:2;12356:18;;;12349:30;12415:34;12410:2;12395:18;;12388:62;-1:-1:-1;;;12481:2:80;12466:18;;12459:42;12533:3;12518:19;;12135:408::o;13326:127::-;13387:10;13382:3;13378:20;13375:1;13368:31;13418:4;13415:1;13408:15;13442:4;13439:1;13432:15;13458:521;13535:4;13541:6;13601:11;13588:25;13695:2;13691:7;13680:8;13664:14;13660:29;13656:43;13636:18;13632:68;13622:96;;13714:1;13711;13704:12;13622:96;13741:33;;13793:20;;;-1:-1:-1;;;;;;13825:30:80;;13822:50;;;13868:1;13865;13858:12;13822:50;13901:4;13889:17;;-1:-1:-1;13932:14:80;13928:27;;;13918:38;;13915:58;;;13969:1;13966;13959:12;14394:184;14464:6;14517:2;14505:9;14496:7;14492:23;14488:32;14485:52;;;14533:1;14530;14523:12;14485:52;-1:-1:-1;14556:16:80;;14394:184;-1:-1:-1;14394:184:80:o;15684:251::-;15754:6;15807:2;15795:9;15786:7;15782:23;15778:32;15775:52;;;15823:1;15820;15813:12;15775:52;15855:9;15849:16;15874:31;15899:5;15874:31;:::i;16301:1395::-;16390:6;16443:3;16431:9;16422:7;16418:23;16414:33;16411:53;;;16460:1;16457;16450:12;16411:53;16486:22;;:::i;:::-;16544:9;16531:23;16524:5;16517:38;16615:2;16604:9;16600:18;16587:32;16582:2;16575:5;16571:14;16564:56;16680:2;16669:9;16665:18;16652:32;16647:2;16640:5;16636:14;16629:56;16745:2;16734:9;16730:18;16717:32;16712:2;16705:5;16701:14;16694:56;16811:3;16800:9;16796:19;16783:33;16777:3;16770:5;16766:15;16759:58;16878:3;16867:9;16863:19;16850:33;16844:3;16837:5;16833:15;16826:58;16945:3;16934:9;16930:19;16917:33;16911:3;16904:5;16900:15;16893:58;16984:39;17018:3;17007:9;17003:19;16984:39;:::i;:::-;16978:3;16971:5;16967:15;16960:64;17043:3;17078:37;17111:2;17100:9;17096:18;17078:37;:::i;:::-;17062:14;;;17055:61;17135:3;17170:37;17188:18;;;17170:37;:::i;:::-;17154:14;;;17147:61;17227:3;17262:37;17280:18;;;17262:37;:::i;:::-;17246:14;;;17239:61;17319:3;17354:37;17372:18;;;17354:37;:::i;:::-;17338:14;;;17331:61;17411:3;17446:37;17464:18;;;17446:37;:::i;:::-;17430:14;;;17423:61;17503:3;17538:37;17556:18;;;17538:37;:::i;:::-;17522:14;;;17515:61;17595:3;17630:35;17646:18;;;17630:35;:::i;:::-;17614:14;;;17607:59;17618:5;16301:1395;-1:-1:-1;;;16301:1395:80:o;19091:222::-;19156:9;;;19177:10;;;19174:133;;;19229:10;19224:3;19220:20;19217:1;19210:31;19264:4;19261:1;19254:15;19292:4;19289:1;19282:15;21057:250;21142:1;21152:113;21166:6;21163:1;21160:13;21152:113;;;21242:11;;;21236:18;21223:11;;;21216:39;21188:2;21181:10;21152:113;;;-1:-1:-1;;21299:1:80;21281:16;;21274:27;21057:250::o;21312:270::-;21353:3;21391:5;21385:12;21418:6;21413:3;21406:19;21434:76;21503:6;21496:4;21491:3;21487:14;21480:4;21473:5;21469:16;21434:76;:::i;:::-;21564:2;21543:15;-1:-1:-1;;21539:29:80;21530:39;;;;21571:4;21526:50;;21312:270;-1:-1:-1;;21312:270:80:o;21587:396::-;21785:4;21814:3;21826:50;21866:9;21858:6;21826:50;:::i;:::-;21913:2;21907:3;21896:9;21892:19;21885:31;21933:44;21973:2;21962:9;21958:18;21950:6;21933:44;:::i;:::-;21925:52;21587:396;-1:-1:-1;;;;;21587:396:80:o;21988:245::-;22055:6;22108:2;22096:9;22087:7;22083:23;22079:32;22076:52;;;22124:1;22121;22114:12;22076:52;22156:9;22150:16;22175:28;22197:5;22175:28;:::i;22238:407::-;22440:2;22422:21;;;22479:2;22459:18;;;22452:30;22518:34;22513:2;22498:18;;22491:62;-1:-1:-1;;;22584:2:80;22569:18;;22562:41;22635:3;22620:19;;22238:407::o;23064:287::-;23193:3;23231:6;23225:13;23247:66;23306:6;23301:3;23294:4;23286:6;23282:17;23247:66;:::i;:::-;23329:16;;;;;23064:287;-1:-1:-1;;23064:287:80:o;23714:219::-;23863:2;23852:9;23845:21;23826:4;23883:44;23923:2;23912:9;23908:18;23900:6;23883:44;:::i","linkReferences":{},"immutableReferences":{"9880":[{"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(bytes[],bytes[])":"72b6347b","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\"}],\"indexed\":false,\"internalType\":\"struct TaikoData.BlockMetadata\",\"name\":\"meta\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"txList\",\"type\":\"bytes\"}],\"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\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"txLists\",\"type\":\"bytes[]\"}],\"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\":\"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(bytes[],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\":\"0x05c75f9d24b69123f1857f18a61a81d9099143359d533e654cb037f04e3e2379\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://691e07f19889f69b754d87a9dfb75214bba832c977d9058d87513d865be0cfdf\",\"dweb:/ipfs/QmUrr5BcoSCCuQD67A4BMSLvwD6RCAL9npGDsa2XnGMfya\"]},\"contracts/L1/TaikoErrors.sol\":{\"keccak256\":\"0x7d1c24557fd5d59bc24d350eeac7b9b5156f3816535d7414dd32eb97f2aa9bf2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://92d84503e0117af0d2df1eecc7ad6b90319114fe8312a1eae0d2409ca5ced968\",\"dweb:/ipfs/QmRraNzpSGxU9AFFReLGcCEngDqtwrYvS3y7wu66vQXRcd\"]},\"contracts/L1/TaikoEvents.sol\":{\"keccak256\":\"0x24fd15359cdc8a53a65b6ca6bebe4e05c5171669c92237e4970ce73945877b9b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8a40b73975de988b8a4deabb2817e865e3b18b5e7871ec96914c8a7f2c5333ae\",\"dweb:/ipfs/QmQijZ196gC3tKkXDa1msT47PyxZUuaRELqTfigHKWGUzW\"]},\"contracts/L1/TaikoL1.sol\":{\"keccak256\":\"0x521dd9c93678fcfd3fb832afc588a12ee557b044570d33db14ffb5a702896b6d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://75377e918bad26569d486c4d8fdfd2e4bc9a5fd4b8f2b7a9fef477b33b6b8255\",\"dweb:/ipfs/QmZ4AZfmtNS5FHRmURydULtvqutqAwuZrbmgBnHzhhn19h\"]},\"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"}],"indexed":false},{"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":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bytes[]","name":"txLists","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"}]}]},{"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(bytes[],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":"0x05c75f9d24b69123f1857f18a61a81d9099143359d533e654cb037f04e3e2379","urls":["bzz-raw://691e07f19889f69b754d87a9dfb75214bba832c977d9058d87513d865be0cfdf","dweb:/ipfs/QmUrr5BcoSCCuQD67A4BMSLvwD6RCAL9npGDsa2XnGMfya"],"license":"MIT"},"contracts/L1/TaikoErrors.sol":{"keccak256":"0x7d1c24557fd5d59bc24d350eeac7b9b5156f3816535d7414dd32eb97f2aa9bf2","urls":["bzz-raw://92d84503e0117af0d2df1eecc7ad6b90319114fe8312a1eae0d2409ca5ced968","dweb:/ipfs/QmRraNzpSGxU9AFFReLGcCEngDqtwrYvS3y7wu66vQXRcd"],"license":"MIT"},"contracts/L1/TaikoEvents.sol":{"keccak256":"0x24fd15359cdc8a53a65b6ca6bebe4e05c5171669c92237e4970ce73945877b9b","urls":["bzz-raw://8a40b73975de988b8a4deabb2817e865e3b18b5e7871ec96914c8a7f2c5333ae","dweb:/ipfs/QmQijZ196gC3tKkXDa1msT47PyxZUuaRELqTfigHKWGUzW"],"license":"MIT"},"contracts/L1/TaikoL1.sol":{"keccak256":"0x521dd9c93678fcfd3fb832afc588a12ee557b044570d33db14ffb5a702896b6d","urls":["bzz-raw://75377e918bad26569d486c4d8fdfd2e4bc9a5fd4b8f2b7a9fef477b33b6b8255","dweb:/ipfs/QmZ4AZfmtNS5FHRmURydULtvqutqAwuZrbmgBnHzhhn19h"],"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},"ast":{"absolutePath":"contracts/L1/TaikoL1.sol","id":873,"exportedSymbols":{"Address":[10310],"AddressResolver":[2368],"AddressUpgradeable":[5899],"ContextUpgradeable":[5950],"ERC1967Upgrade":[9802],"EssentialContract":[2734],"IAddressManager":[2748],"IAddressResolver":[2774],"IBeacon":[9864],"IERC1822Proxiable":[9461],"IERC1967":[9451],"ISequencerRegistry":[1007],"Initializable":[3870],"LibNetwork":[3233],"Ownable2StepUpgradeable":[3441],"OwnableUpgradeable":[3574],"StorageSlot":[10420],"TaikoData":[313],"TaikoErrors":[395],"TaikoEvents":[427],"TaikoL1":[872],"UUPSUpgradeable":[9980]},"nodeType":"SourceUnit","src":"206:8334:4","nodes":[{"id":429,"nodeType":"PragmaDirective","src":"206:24:4","nodes":[],"literals":["solidity","^","0.8",".20"]},{"id":430,"nodeType":"ImportDirective","src":"232:41:4","nodes":[],"absolutePath":"contracts/common/EssentialContract.sol","file":"../common/EssentialContract.sol","nameLocation":"-1:-1:-1","scope":873,"sourceUnit":2735,"symbolAliases":[],"unitAlias":""},{"id":431,"nodeType":"ImportDirective","src":"274:27:4","nodes":[],"absolutePath":"contracts/L1/TaikoErrors.sol","file":"./TaikoErrors.sol","nameLocation":"-1:-1:-1","scope":873,"sourceUnit":396,"symbolAliases":[],"unitAlias":""},{"id":432,"nodeType":"ImportDirective","src":"302:43:4","nodes":[],"absolutePath":"contracts/L1/preconfs/ISequencerRegistry.sol","file":"./preconfs/ISequencerRegistry.sol","nameLocation":"-1:-1:-1","scope":873,"sourceUnit":1008,"symbolAliases":[],"unitAlias":""},{"id":433,"nodeType":"ImportDirective","src":"346:27:4","nodes":[],"absolutePath":"contracts/L1/TaikoEvents.sol","file":"./TaikoEvents.sol","nameLocation":"-1:-1:-1","scope":873,"sourceUnit":428,"symbolAliases":[],"unitAlias":""},{"id":872,"nodeType":"ContractDefinition","src":"394:8145:4","nodes":[{"id":444,"nodeType":"EventDefinition","src":"464:33:4","nodes":[],"anonymous":false,"eventSelector":"ed64db85835d07c3c990b8ebdd55e32d64e5ed53143b6ef2179e7bfaf17ddc3b","name":"ProvingPaused","nameLocation":"470:13:4","parameters":{"id":443,"nodeType":"ParameterList","parameters":[{"constant":false,"id":442,"indexed":false,"mutability":"mutable","name":"paused","nameLocation":"489:6:4","nodeType":"VariableDeclaration","scope":444,"src":"484:11:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":441,"name":"bool","nodeType":"ElementaryTypeName","src":"484:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"483:13:4"}},{"id":447,"nodeType":"VariableDeclaration","src":"503:61:4","nodes":[],"constant":true,"functionSelector":"6b5ad7e0","mutability":"constant","name":"SECURITY_DELAY_AFTER_PROVEN","nameLocation":"527:27:4","scope":872,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":445,"name":"uint256","nodeType":"ElementaryTypeName","src":"503:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"hexValue":"38","id":446,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"557:7:4","subdenomination":"hours","typeDescriptions":{"typeIdentifier":"t_rational_28800_by_1","typeString":"int_const 28800"},"value":"8"},"visibility":"public"},{"id":452,"nodeType":"VariableDeclaration","src":"685:54:4","nodes":[],"constant":true,"functionSelector":"81e3925f","mutability":"constant","name":"MAX_BYTES_PER_BLOB","nameLocation":"709:18:4","scope":872,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":448,"name":"uint256","nodeType":"ElementaryTypeName","src":"685:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"value":{"commonType":{"typeIdentifier":"t_rational_131072_by_1","typeString":"int_const 131072"},"id":451,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"34303936","id":449,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"730:4:4","typeDescriptions":{"typeIdentifier":"t_rational_4096_by_1","typeString":"int_const 4096"},"value":"4096"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"3332","id":450,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"737:2:4","typeDescriptions":{"typeIdentifier":"t_rational_32_by_1","typeString":"int_const 32"},"value":"32"},"src":"730:9:4","typeDescriptions":{"typeIdentifier":"t_rational_131072_by_1","typeString":"int_const 131072"}},"visibility":"public"},{"id":455,"nodeType":"VariableDeclaration","src":"746:28:4","nodes":[],"constant":false,"functionSelector":"c19d93fb","mutability":"mutable","name":"state","nameLocation":"769:5:4","scope":872,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_State_$312_storage","typeString":"struct TaikoData.State"},"typeName":{"id":454,"nodeType":"UserDefinedTypeName","pathNode":{"id":453,"name":"TaikoData.State","nameLocations":["746:9:4","756:5:4"],"nodeType":"IdentifierPath","referencedDeclaration":312,"src":"746:15:4"},"referencedDeclaration":312,"src":"746:15:4","typeDescriptions":{"typeIdentifier":"t_struct$_State_$312_storage_ptr","typeString":"struct TaikoData.State"}},"visibility":"public"},{"id":459,"nodeType":"VariableDeclaration","src":"780:26:4","nodes":[],"constant":false,"mutability":"mutable","name":"__gap","nameLocation":"801:5:4","scope":872,"stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$100_storage","typeString":"uint256[100]"},"typeName":{"baseType":{"id":456,"name":"uint256","nodeType":"ElementaryTypeName","src":"780:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":458,"length":{"hexValue":"313030","id":457,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"788:3:4","typeDescriptions":{"typeIdentifier":"t_rational_100_by_1","typeString":"int_const 100"},"value":"100"},"nodeType":"ArrayTypeName","src":"780:12:4","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$100_storage_ptr","typeString":"uint256[100]"}},"visibility":"private"},{"id":549,"nodeType":"FunctionDefinition","src":"984:743:4","nodes":[],"body":{"id":548,"nodeType":"Block","src":"1137:590:4","nodes":[],"statements":[{"expression":{"arguments":[{"id":472,"name":"_owner","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":462,"src":"1164:6:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},{"id":473,"name":"_addressManager","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":464,"src":"1172:15:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"},{"typeIdentifier":"t_address","typeString":"address"}],"id":471,"name":"__Essential_init","nodeType":"Identifier","overloadedDeclarations":[2610,2638],"referencedDeclaration":2610,"src":"1147:16:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_address_$_t_address_$returns$__$","typeString":"function (address,address)"}},"id":474,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1147:41:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":475,"nodeType":"ExpressionStatement","src":"1147:41:4"},{"assignments":[480],"declarations":[{"constant":false,"id":480,"mutability":"mutable","name":"config","nameLocation":"1223:6:4","nodeType":"VariableDeclaration","scope":548,"src":"1199:30:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config"},"typeName":{"id":479,"nodeType":"UserDefinedTypeName","pathNode":{"id":478,"name":"TaikoData.Config","nameLocations":["1199:9:4","1209:6:4"],"nodeType":"IdentifierPath","referencedDeclaration":220,"src":"1199:16:4"},"referencedDeclaration":220,"src":"1199:16:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_storage_ptr","typeString":"struct TaikoData.Config"}},"visibility":"internal"}],"id":483,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":481,"name":"getConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":798,"src":"1232:9:4","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_struct$_Config_$220_memory_ptr_$","typeString":"function () view returns (struct TaikoData.Config memory)"}},"id":482,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1232:11:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}},"nodeType":"VariableDeclarationStatement","src":"1199:44:4"},{"expression":{"arguments":[{"arguments":[{"id":486,"name":"config","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":480,"src":"1275:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}],"id":485,"name":"isConfigValid","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":833,"src":"1261:13:4","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_Config_$220_memory_ptr_$returns$_t_bool_$","typeString":"function (struct TaikoData.Config memory) pure returns (bool)"}},"id":487,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1261:21:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c696420636f6e666967","id":488,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1284:16:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_b25d2634571c1dc6b4bb592898283f1b8e157211e4dac546916061293bac7b80","typeString":"literal_string \"invalid config\""},"value":"invalid config"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b25d2634571c1dc6b4bb592898283f1b8e157211e4dac546916061293bac7b80","typeString":"literal_string \"invalid config\""}],"id":484,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1253:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":489,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1253:48:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":490,"nodeType":"ExpressionStatement","src":"1253:48:4"},{"expression":{"id":499,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":491,"name":"state","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":455,"src":"1334:5:4","typeDescriptions":{"typeIdentifier":"t_struct$_State_$312_storage","typeString":"struct TaikoData.State storage ref"}},"id":493,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1340:13:4","memberName":"genesisHeight","nodeType":"MemberAccess","referencedDeclaration":297,"src":"1334:19:4","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":496,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"1363:5:4","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":497,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1369:6:4","memberName":"number","nodeType":"MemberAccess","src":"1363:12:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":495,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1356:6:4","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":494,"name":"uint64","nodeType":"ElementaryTypeName","src":"1356:6:4","typeDescriptions":{}}},"id":498,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1356:20:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"1334:42:4","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"id":500,"nodeType":"ExpressionStatement","src":"1334:42:4"},{"expression":{"id":509,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":501,"name":"state","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":455,"src":"1386:5:4","typeDescriptions":{"typeIdentifier":"t_struct$_State_$312_storage","typeString":"struct TaikoData.State storage ref"}},"id":503,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1392:16:4","memberName":"genesisTimestamp","nodeType":"MemberAccess","referencedDeclaration":299,"src":"1386:22:4","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":506,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"1418:5:4","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":507,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1424:9:4","memberName":"timestamp","nodeType":"MemberAccess","src":"1418:15:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":505,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1411:6:4","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":504,"name":"uint64","nodeType":"ElementaryTypeName","src":"1411:6:4","typeDescriptions":{}}},"id":508,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1411:23:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"1386:48:4","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"id":510,"nodeType":"ExpressionStatement","src":"1386:48:4"},{"expression":{"id":515,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":511,"name":"state","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":455,"src":"1444:5:4","typeDescriptions":{"typeIdentifier":"t_struct$_State_$312_storage","typeString":"struct TaikoData.State storage ref"}},"id":513,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1450:9:4","memberName":"numBlocks","nodeType":"MemberAccess","referencedDeclaration":301,"src":"1444:15:4","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"hexValue":"31","id":514,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1462:1:4","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"1444:19:4","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"id":516,"nodeType":"ExpressionStatement","src":"1444:19:4"},{"assignments":[521],"declarations":[{"constant":false,"id":521,"mutability":"mutable","name":"blk","nameLocation":"1532:3:4","nodeType":"VariableDeclaration","scope":548,"src":"1508:27:4","stateVariable":false,"storageLocation":"storage","typeDescriptions":{"typeIdentifier":"t_struct$_Block_$282_storage_ptr","typeString":"struct TaikoData.Block"},"typeName":{"id":520,"nodeType":"UserDefinedTypeName","pathNode":{"id":519,"name":"TaikoData.Block","nameLocations":["1508:9:4","1518:5:4"],"nodeType":"IdentifierPath","referencedDeclaration":282,"src":"1508:15:4"},"referencedDeclaration":282,"src":"1508:15:4","typeDescriptions":{"typeIdentifier":"t_struct$_Block_$282_storage_ptr","typeString":"struct TaikoData.Block"}},"visibility":"internal"}],"id":526,"initialValue":{"baseExpression":{"expression":{"id":522,"name":"state","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":455,"src":"1538:5:4","typeDescriptions":{"typeIdentifier":"t_struct$_State_$312_storage","typeString":"struct TaikoData.State storage ref"}},"id":523,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"1544:6:4","memberName":"blocks","nodeType":"MemberAccess","referencedDeclaration":288,"src":"1538:12:4","typeDescriptions":{"typeIdentifier":"t_mapping$_t_uint256_$_t_struct$_Block_$282_storage_$","typeString":"mapping(uint256 => struct TaikoData.Block storage ref)"}},"id":525,"indexExpression":{"hexValue":"30","id":524,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1551:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"1538:15:4","typeDescriptions":{"typeIdentifier":"t_struct$_Block_$282_storage","typeString":"struct TaikoData.Block storage ref"}},"nodeType":"VariableDeclarationStatement","src":"1508:45:4"},{"expression":{"id":531,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":527,"name":"blk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"1563:3:4","typeDescriptions":{"typeIdentifier":"t_struct$_Block_$282_storage_ptr","typeString":"struct TaikoData.Block storage pointer"}},"id":529,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1567:9:4","memberName":"blockHash","nodeType":"MemberAccess","referencedDeclaration":273,"src":"1563:13:4","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":530,"name":"_genesisBlockHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":466,"src":"1579:17:4","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"1563:33:4","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"id":532,"nodeType":"ExpressionStatement","src":"1563:33:4"},{"expression":{"id":541,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":533,"name":"blk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":521,"src":"1606:3:4","typeDescriptions":{"typeIdentifier":"t_struct$_Block_$282_storage_ptr","typeString":"struct TaikoData.Block storage pointer"}},"id":535,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberLocation":"1610:9:4","memberName":"timestamp","nodeType":"MemberAccess","referencedDeclaration":279,"src":"1606:13:4","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":538,"name":"block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-4,"src":"1629:5:4","typeDescriptions":{"typeIdentifier":"t_magic_block","typeString":"block"}},"id":539,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"1635:9:4","memberName":"timestamp","nodeType":"MemberAccess","src":"1629:15:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":537,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1622:6:4","typeDescriptions":{"typeIdentifier":"t_type$_t_uint64_$","typeString":"type(uint64)"},"typeName":{"id":536,"name":"uint64","nodeType":"ElementaryTypeName","src":"1622:6:4","typeDescriptions":{}}},"id":540,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"1622:23:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"src":"1606:39:4","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"id":542,"nodeType":"ExpressionStatement","src":"1606:39:4"},{"eventCall":{"arguments":[{"hexValue":"30","id":544,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1686:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"id":545,"name":"_genesisBlockHash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":466,"src":"1700:17:4","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_bytes32","typeString":"bytes32"}],"id":543,"name":"BlockVerified","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":416,"src":"1661:13:4","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$_t_bytes32_$returns$__$","typeString":"function (uint256,bytes32)"}},"id":546,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":["1677:7:4","1689:9:4"],"names":["blockId","blockHash"],"nodeType":"FunctionCall","src":"1661:59:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":547,"nodeType":"EmitStatement","src":"1656:64:4"}]},"documentation":{"id":460,"nodeType":"StructuredDocumentation","src":"813:166:4","text":"@notice Initializes the rollup.\n @param _addressManager The {AddressManager} address.\n @param _genesisBlockHash The block hash of the genesis block."},"functionSelector":"347258aa","implemented":true,"kind":"function","modifiers":[{"id":469,"kind":"modifierInvocation","modifierName":{"id":468,"name":"initializer","nameLocations":["1121:11:4"],"nodeType":"IdentifierPath","referencedDeclaration":3772,"src":"1121:11:4"},"nodeType":"ModifierInvocation","src":"1121:11:4"}],"name":"init","nameLocation":"993:4:4","parameters":{"id":467,"nodeType":"ParameterList","parameters":[{"constant":false,"id":462,"mutability":"mutable","name":"_owner","nameLocation":"1015:6:4","nodeType":"VariableDeclaration","scope":549,"src":"1007:14:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":461,"name":"address","nodeType":"ElementaryTypeName","src":"1007:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":464,"mutability":"mutable","name":"_addressManager","nameLocation":"1039:15:4","nodeType":"VariableDeclaration","scope":549,"src":"1031:23:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":463,"name":"address","nodeType":"ElementaryTypeName","src":"1031:7:4","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":466,"mutability":"mutable","name":"_genesisBlockHash","nameLocation":"1072:17:4","nodeType":"VariableDeclaration","scope":549,"src":"1064:25:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":465,"name":"bytes32","nodeType":"ElementaryTypeName","src":"1064:7:4","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"}],"src":"997:98:4"},"returnParameters":{"id":470,"nodeType":"ParameterList","parameters":[],"src":"1137:0:4"},"scope":872,"stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"id":648,"nodeType":"FunctionDefinition","src":"1781:947:4","nodes":[],"body":{"id":647,"nodeType":"Block","src":"2013:715:4","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":570,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":567,"name":"txLists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":556,"src":"2027:7:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":568,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2035:6:4","memberName":"length","nodeType":"MemberAccess","src":"2027:14:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":569,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2045:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2027:19:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":581,"nodeType":"IfStatement","src":"2023:116:4","trueBody":{"id":580,"nodeType":"Block","src":"2048:91:4","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":576,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":572,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":553,"src":"2070:4:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":573,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2075:6:4","memberName":"length","nodeType":"MemberAccess","src":"2070:11:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":574,"name":"txLists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":556,"src":"2085:7:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":575,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2093:6:4","memberName":"length","nodeType":"MemberAccess","src":"2085:14:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2070:29:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"6d69736d61746368656420706172616d73206c656e677468","id":577,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2101:26:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_1eacf5a944ea9dc2837baaa7d8674fe853cae4fcb9f38cb02a971f30eaf8f196","typeString":"literal_string \"mismatched params length\""},"value":"mismatched params length"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_1eacf5a944ea9dc2837baaa7d8674fe853cae4fcb9f38cb02a971f30eaf8f196","typeString":"literal_string \"mismatched params length\""}],"id":571,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2062:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":578,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2062:66:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":579,"nodeType":"ExpressionStatement","src":"2062:66:4"}]}},{"expression":{"id":590,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":582,"name":"_blocks","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":565,"src":"2149:7:4","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_BlockMetadata_$252_memory_ptr_$dyn_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory[] memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"expression":{"id":587,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":553,"src":"2189:4:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":588,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2194:6:4","memberName":"length","nodeType":"MemberAccess","src":"2189:11:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":586,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"2159:29:4","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_BlockMetadata_$252_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct TaikoData.BlockMetadata memory[] memory)"},"typeName":{"baseType":{"id":584,"nodeType":"UserDefinedTypeName","pathNode":{"id":583,"name":"TaikoData.BlockMetadata","nameLocations":["2163:9:4","2173:13:4"],"nodeType":"IdentifierPath","referencedDeclaration":252,"src":"2163:23:4"},"referencedDeclaration":252,"src":"2163:23:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_storage_ptr","typeString":"struct TaikoData.BlockMetadata"}},"id":585,"nodeType":"ArrayTypeName","src":"2163:25:4","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_BlockMetadata_$252_storage_$dyn_storage_ptr","typeString":"struct TaikoData.BlockMetadata[]"}}},"id":589,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2159:42:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_BlockMetadata_$252_memory_ptr_$dyn_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory[] memory"}},"src":"2149:52:4","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_BlockMetadata_$252_memory_ptr_$dyn_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory[] memory"}},"id":591,"nodeType":"ExpressionStatement","src":"2149:52:4"},{"body":{"id":645,"nodeType":"Block","src":"2253:469:4","statements":[{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":606,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":603,"name":"txLists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":556,"src":"2271:7:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":604,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2279:6:4","memberName":"length","nodeType":"MemberAccess","src":"2271:14:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":605,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2289:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"2271:19:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":635,"nodeType":"Block","src":"2441:113:4","statements":[{"expression":{"id":633,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":621,"name":"_blocks","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":565,"src":"2493:7:4","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_BlockMetadata_$252_memory_ptr_$dyn_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory[] memory"}},"id":623,"indexExpression":{"id":622,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":593,"src":"2501:1:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2493:10:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":625,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":553,"src":"2520:4:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":627,"indexExpression":{"id":626,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":593,"src":"2525:1:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2520:7:4","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"arguments":[{"hexValue":"","id":630,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2535:2:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""},"value":""}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","typeString":"literal_string \"\""}],"id":629,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2529:5:4","typeDescriptions":{"typeIdentifier":"t_type$_t_bytes_storage_ptr_$","typeString":"type(bytes storage pointer)"},"typeName":{"id":628,"name":"bytes","nodeType":"ElementaryTypeName","src":"2529:5:4","typeDescriptions":{}}},"id":631,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2529:9:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":624,"name":"_proposeBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":783,"src":"2506:13:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes_calldata_ptr_$_t_bytes_memory_ptr_$returns$_t_struct$_BlockMetadata_$252_memory_ptr_$","typeString":"function (bytes calldata,bytes memory) returns (struct TaikoData.BlockMetadata memory)"}},"id":632,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2506:33:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"src":"2493:46:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":634,"nodeType":"ExpressionStatement","src":"2493:46:4"}]},"id":636,"nodeType":"IfStatement","src":"2267:287:4","trueBody":{"id":620,"nodeType":"Block","src":"2292:143:4","statements":[{"expression":{"id":618,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":607,"name":"_blocks","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":565,"src":"2373:7:4","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_BlockMetadata_$252_memory_ptr_$dyn_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory[] memory"}},"id":609,"indexExpression":{"id":608,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":593,"src":"2381:1:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"2373:10:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":611,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":553,"src":"2400:4:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":613,"indexExpression":{"id":612,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":593,"src":"2405:1:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2400:7:4","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"baseExpression":{"id":614,"name":"txLists","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":556,"src":"2409:7:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":616,"indexExpression":{"id":615,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":593,"src":"2417:1:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2409:10:4","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}],"id":610,"name":"_proposeBlock","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":783,"src":"2386:13:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$_t_bytes_calldata_ptr_$_t_bytes_memory_ptr_$returns$_t_struct$_BlockMetadata_$252_memory_ptr_$","typeString":"function (bytes calldata,bytes memory) returns (struct TaikoData.BlockMetadata memory)"}},"id":617,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2386:34:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"src":"2373:47:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":619,"nodeType":"ExpressionStatement","src":"2373:47:4"}]}},{"condition":{"id":639,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"2626:23:4","subExpression":{"arguments":[],"expression":{"argumentTypes":[],"id":637,"name":"_isProposerPermitted","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":871,"src":"2627:20:4","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$_t_bool_$","typeString":"function () returns (bool)"}},"id":638,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2627:22:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":644,"nodeType":"IfStatement","src":"2622:90:4","trueBody":{"id":643,"nodeType":"Block","src":"2651:61:4","statements":[{"errorCall":{"arguments":[],"expression":{"argumentTypes":[],"id":640,"name":"L1_INVALID_PROPOSER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":356,"src":"2676:19:4","typeDescriptions":{"typeIdentifier":"t_function_error_pure$__$returns$__$","typeString":"function () pure"}},"id":641,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"2676:21:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":642,"nodeType":"RevertStatement","src":"2669:28:4"}]}}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":599,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":596,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":593,"src":"2231:1:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":597,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":553,"src":"2235:4:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes calldata[] calldata"}},"id":598,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"2240:6:4","memberName":"length","nodeType":"MemberAccess","src":"2235:11:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2231:15:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":646,"initializationExpression":{"assignments":[593],"declarations":[{"constant":false,"id":593,"mutability":"mutable","name":"i","nameLocation":"2224:1:4","nodeType":"VariableDeclaration","scope":646,"src":"2216:9:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":592,"name":"uint256","nodeType":"ElementaryTypeName","src":"2216:7:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":595,"initialValue":{"hexValue":"30","id":594,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2228:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"2216:13:4"},"isSimpleCounterLoop":true,"loopExpression":{"expression":{"id":601,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"2248:3:4","subExpression":{"id":600,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":593,"src":"2248:1:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":602,"nodeType":"ExpressionStatement","src":"2248:3:4"},"nodeType":"ForStatement","src":"2211:511:4"}]},"documentation":{"id":550,"nodeType":"StructuredDocumentation","src":"1733:43:4","text":"@dev Proposes multiple Taiko L2 blocks."},"functionSelector":"72b6347b","implemented":true,"kind":"function","modifiers":[{"id":559,"kind":"modifierInvocation","modifierName":{"id":558,"name":"nonReentrant","nameLocations":["1915:12:4"],"nodeType":"IdentifierPath","referencedDeclaration":2473,"src":"1915:12:4"},"nodeType":"ModifierInvocation","src":"1915:12:4"},{"id":561,"kind":"modifierInvocation","modifierName":{"id":560,"name":"whenNotPaused","nameLocations":["1936:13:4"],"nodeType":"IdentifierPath","referencedDeclaration":2494,"src":"1936:13:4"},"nodeType":"ModifierInvocation","src":"1936:13:4"}],"name":"proposeBlock","nameLocation":"1790:12:4","parameters":{"id":557,"nodeType":"ParameterList","parameters":[{"constant":false,"id":553,"mutability":"mutable","name":"data","nameLocation":"1829:4:4","nodeType":"VariableDeclaration","scope":648,"src":"1812:21:4","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes[]"},"typeName":{"baseType":{"id":551,"name":"bytes","nodeType":"ElementaryTypeName","src":"1812:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"id":552,"nodeType":"ArrayTypeName","src":"1812:7:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_storage_$dyn_storage_ptr","typeString":"bytes[]"}},"visibility":"internal"},{"constant":false,"id":556,"mutability":"mutable","name":"txLists","nameLocation":"1860:7:4","nodeType":"VariableDeclaration","scope":648,"src":"1843:24:4","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_calldata_ptr_$dyn_calldata_ptr","typeString":"bytes[]"},"typeName":{"baseType":{"id":554,"name":"bytes","nodeType":"ElementaryTypeName","src":"1843:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"id":555,"nodeType":"ArrayTypeName","src":"1843:7:4","typeDescriptions":{"typeIdentifier":"t_array$_t_bytes_storage_$dyn_storage_ptr","typeString":"bytes[]"}},"visibility":"internal"}],"src":"1802:71:4"},"returnParameters":{"id":566,"nodeType":"ParameterList","parameters":[{"constant":false,"id":565,"mutability":"mutable","name":"_blocks","nameLocation":"2000:7:4","nodeType":"VariableDeclaration","scope":648,"src":"1967:40:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_BlockMetadata_$252_memory_ptr_$dyn_memory_ptr","typeString":"struct TaikoData.BlockMetadata[]"},"typeName":{"baseType":{"id":563,"nodeType":"UserDefinedTypeName","pathNode":{"id":562,"name":"TaikoData.BlockMetadata","nameLocations":["1967:9:4","1977:13:4"],"nodeType":"IdentifierPath","referencedDeclaration":252,"src":"1967:23:4"},"referencedDeclaration":252,"src":"1967:23:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_storage_ptr","typeString":"struct TaikoData.BlockMetadata"}},"id":564,"nodeType":"ArrayTypeName","src":"1967:25:4","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_BlockMetadata_$252_storage_$dyn_storage_ptr","typeString":"struct TaikoData.BlockMetadata[]"}},"visibility":"internal"}],"src":"1966:42:4"},"scope":872,"stateMutability":"payable","virtual":false,"visibility":"external"},{"id":783,"nodeType":"FunctionDefinition","src":"2974:3693:4","nodes":[],"body":{"id":782,"nodeType":"Block","src":"3137:3530:4","nodes":[],"statements":[{"assignments":[663],"declarations":[{"constant":false,"id":663,"mutability":"mutable","name":"config","nameLocation":"3171:6:4","nodeType":"VariableDeclaration","scope":782,"src":"3147:30:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config"},"typeName":{"id":662,"nodeType":"UserDefinedTypeName","pathNode":{"id":661,"name":"TaikoData.Config","nameLocations":["3147:9:4","3157:6:4"],"nodeType":"IdentifierPath","referencedDeclaration":220,"src":"3147:16:4"},"referencedDeclaration":220,"src":"3147:16:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_storage_ptr","typeString":"struct TaikoData.Config"}},"visibility":"internal"}],"id":666,"initialValue":{"arguments":[],"expression":{"argumentTypes":[],"id":664,"name":"getConfig","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":798,"src":"3180:9:4","typeDescriptions":{"typeIdentifier":"t_function_internal_view$__$returns$_t_struct$_Config_$220_memory_ptr_$","typeString":"function () view returns (struct TaikoData.Config memory)"}},"id":665,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3180:11:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}},"nodeType":"VariableDeclarationStatement","src":"3147:44:4"},{"expression":{"id":675,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":667,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"3235:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":670,"name":"data","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":651,"src":"3255:4:4","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"}},{"components":[{"expression":{"id":671,"name":"TaikoData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":313,"src":"3262:9:4","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TaikoData_$313_$","typeString":"type(library TaikoData)"}},"id":672,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3272:13:4","memberName":"BlockMetadata","nodeType":"MemberAccess","referencedDeclaration":252,"src":"3262:23:4","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_BlockMetadata_$252_storage_ptr_$","typeString":"type(struct TaikoData.BlockMetadata storage pointer)"}}],"id":673,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3261:25:4","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_BlockMetadata_$252_storage_ptr_$","typeString":"type(struct TaikoData.BlockMetadata storage pointer)"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes calldata"},{"typeIdentifier":"t_type$_t_struct$_BlockMetadata_$252_storage_ptr_$","typeString":"type(struct TaikoData.BlockMetadata storage pointer)"}],"expression":{"id":668,"name":"abi","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-1,"src":"3244:3:4","typeDescriptions":{"typeIdentifier":"t_magic_abi","typeString":"abi"}},"id":669,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"memberLocation":"3248:6:4","memberName":"decode","nodeType":"MemberAccess","src":"3244:10:4","typeDescriptions":{"typeIdentifier":"t_function_abidecode_pure$__$returns$__$","typeString":"function () pure"}},"id":674,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3244:43:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"src":"3235:52:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":676,"nodeType":"ExpressionStatement","src":"3235:52:4"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":684,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":678,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"3408:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":679,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3415:6:4","memberName":"l1Hash","nodeType":"MemberAccess","referencedDeclaration":229,"src":"3408:13:4","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"expression":{"id":681,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"3435:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":682,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3442:18:4","memberName":"l1StateBlockNumber","nodeType":"MemberAccess","referencedDeclaration":243,"src":"3435:25:4","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint32","typeString":"uint32"}],"id":680,"name":"blockhash","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-5,"src":"3425:9:4","typeDescriptions":{"typeIdentifier":"t_function_blockhash_view$_t_uint256_$returns$_t_bytes32_$","typeString":"function (uint256) view returns (bytes32)"}},"id":683,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3425:36:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"3408:53:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"494e56414c49445f4c315f424c4f434b48415348","id":685,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3463:22:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_4f3e572f7c02b6a4fc3df3acc1a12fc0fff0b85b0cf4b3e73ed70e1ec35405dd","typeString":"literal_string \"INVALID_L1_BLOCKHASH\""},"value":"INVALID_L1_BLOCKHASH"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_4f3e572f7c02b6a4fc3df3acc1a12fc0fff0b85b0cf4b3e73ed70e1ec35405dd","typeString":"literal_string \"INVALID_L1_BLOCKHASH\""}],"id":677,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3400:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":686,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3400:86:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":687,"nodeType":"ExpressionStatement","src":"3400:86:4"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":692,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":689,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"3504:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":690,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3511:9:4","memberName":"blockHash","nodeType":"MemberAccess","referencedDeclaration":223,"src":"3504:16:4","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"307830","id":691,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3524:3:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0x0"},"src":"3504:23:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"494e56414c49445f4c325f424c4f434b48415348","id":693,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3529:22:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_949f1900a7e8c4b25fe6a969a48966bd3f9c87d50b019d7cfddb55419d3bb6db","typeString":"literal_string \"INVALID_L2_BLOCKHASH\""},"value":"INVALID_L2_BLOCKHASH"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_949f1900a7e8c4b25fe6a969a48966bd3f9c87d50b019d7cfddb55419d3bb6db","typeString":"literal_string \"INVALID_L2_BLOCKHASH\""}],"id":688,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3496:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":694,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3496:56:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":695,"nodeType":"ExpressionStatement","src":"3496:56:4"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":701,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":697,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"3678:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":698,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3685:8:4","memberName":"gasLimit","nodeType":"MemberAccess","referencedDeclaration":241,"src":"3678:15:4","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":699,"name":"config","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":663,"src":"3697:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}},"id":700,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3704:16:4","memberName":"blockMaxGasLimit","nodeType":"MemberAccess","referencedDeclaration":217,"src":"3697:23:4","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"src":"3678:42:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"494e56414c49445f4741535f4c494d4954","id":702,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3722:19:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_4a7b16799e5aa53d6b3a59351438346074aa7953296a8856e1d750ebbd99c96a","typeString":"literal_string \"INVALID_GAS_LIMIT\""},"value":"INVALID_GAS_LIMIT"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_4a7b16799e5aa53d6b3a59351438346074aa7953296a8856e1d750ebbd99c96a","typeString":"literal_string \"INVALID_GAS_LIMIT\""}],"id":696,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3670:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":703,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3670:72:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":704,"nodeType":"ExpressionStatement","src":"3670:72:4"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":713,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":706,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"3761:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":707,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3768:8:4","memberName":"blobUsed","nodeType":"MemberAccess","referencedDeclaration":251,"src":"3761:15:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":711,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":708,"name":"txList","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":653,"src":"3781:6:4","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":709,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"3788:6:4","memberName":"length","nodeType":"MemberAccess","src":"3781:13:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":710,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3798:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3781:18:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}}],"id":712,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3780:20:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"3761:39:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"494e56414c49445f424c4f425f55534544","id":714,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"3802:19:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_5578f162c76185378b70870cb895ed7ce84195e813c79868a4bca7818f0e963f","typeString":"literal_string \"INVALID_BLOB_USED\""},"value":"INVALID_BLOB_USED"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_5578f162c76185378b70870cb895ed7ce84195e813c79868a4bca7818f0e963f","typeString":"literal_string \"INVALID_BLOB_USED\""}],"id":705,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"3753:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":715,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"3753:69:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":716,"nodeType":"ExpressionStatement","src":"3753:69:4"},{"condition":{"expression":{"id":717,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"3862:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":718,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"3869:8:4","memberName":"blobUsed","nodeType":"MemberAccess","referencedDeclaration":251,"src":"3862:15:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":764,"nodeType":"Block","src":"4326:260:4","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"id":740,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":735,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"4348:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":736,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4355:8:4","memberName":"blobHash","nodeType":"MemberAccess","referencedDeclaration":233,"src":"4348:15:4","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"id":738,"name":"txList","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":653,"src":"4377:6:4","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":737,"name":"keccak256","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-8,"src":"4367:9:4","typeDescriptions":{"typeIdentifier":"t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$","typeString":"function (bytes memory) pure returns (bytes32)"}},"id":739,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4367:17:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"src":"4348:36:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"494e56414c49445f54584c4953545f48415348","id":741,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4386:21:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_ac3dfcb90dbc4fa009754746099e113f51c02b946baa8748fc5b56ebd3480e43","typeString":"literal_string \"INVALID_TXLIST_HASH\""},"value":"INVALID_TXLIST_HASH"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_ac3dfcb90dbc4fa009754746099e113f51c02b946baa8748fc5b56ebd3480e43","typeString":"literal_string \"INVALID_TXLIST_HASH\""}],"id":734,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4340:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":742,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4340:68:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":743,"nodeType":"ExpressionStatement","src":"4340:68:4"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint24","typeString":"uint24"},"id":748,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":745,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"4430:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":746,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4437:16:4","memberName":"txListByteOffset","nodeType":"MemberAccess","referencedDeclaration":247,"src":"4430:23:4","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":747,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4457:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4430:28:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"494e56414c49445f54584c4953545f5354415254","id":749,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4460:22:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_b032a5fc55d71ef598e2149f812d53248e3fbbb3396ab03d2f619fb6635cca46","typeString":"literal_string \"INVALID_TXLIST_START\""},"value":"INVALID_TXLIST_START"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_b032a5fc55d71ef598e2149f812d53248e3fbbb3396ab03d2f619fb6635cca46","typeString":"literal_string \"INVALID_TXLIST_START\""}],"id":744,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4422:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":750,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4422:61:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":751,"nodeType":"ExpressionStatement","src":"4422:61:4"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint24","typeString":"uint24"},"id":760,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":753,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"4505:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":754,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4512:14:4","memberName":"txListByteSize","nodeType":"MemberAccess","referencedDeclaration":249,"src":"4505:21:4","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"arguments":[{"expression":{"id":757,"name":"txList","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":653,"src":"4537:6:4","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}},"id":758,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"4544:6:4","memberName":"length","nodeType":"MemberAccess","src":"4537:13:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":756,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4530:6:4","typeDescriptions":{"typeIdentifier":"t_type$_t_uint24_$","typeString":"type(uint24)"},"typeName":{"id":755,"name":"uint24","nodeType":"ElementaryTypeName","src":"4530:6:4","typeDescriptions":{}}},"id":759,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4530:21:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"src":"4505:46:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"494e56414c49445f54584c4953545f53495a45","id":761,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4553:21:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_dbf977c117eb509a562233eb34134659e4061fcc8030381fed63fbb43f1d2568","typeString":"literal_string \"INVALID_TXLIST_SIZE\""},"value":"INVALID_TXLIST_SIZE"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_dbf977c117eb509a562233eb34134659e4061fcc8030381fed63fbb43f1d2568","typeString":"literal_string \"INVALID_TXLIST_SIZE\""}],"id":752,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4497:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":762,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4497:78:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":763,"nodeType":"ExpressionStatement","src":"4497:78:4"}]},"id":765,"nodeType":"IfStatement","src":"3858:728:4","trueBody":{"id":733,"nodeType":"Block","src":"3879:441:4","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":729,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":727,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"expression":{"id":722,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"4188:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":723,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4195:16:4","memberName":"txListByteOffset","nodeType":"MemberAccess","referencedDeclaration":247,"src":"4188:23:4","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint24","typeString":"uint24"}],"id":721,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4180:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_uint256_$","typeString":"type(uint256)"},"typeName":{"id":720,"name":"uint256","nodeType":"ElementaryTypeName","src":"4180:7:4","typeDescriptions":{}}},"id":724,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4180:32:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"expression":{"id":725,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"4215:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":726,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4222:14:4","memberName":"txListByteSize","nodeType":"MemberAccess","referencedDeclaration":249,"src":"4215:21:4","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"src":"4180:56:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"id":728,"name":"MAX_BYTES_PER_BLOB","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":452,"src":"4240:18:4","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"4180:78:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c696420626c6f622073697a65","id":730,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4276:19:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_80518a7052b7b18954675805e280bd2fa982c2c9dd7de5f7862064259adfc855","typeString":"literal_string \"invalid blob size\""},"value":"invalid blob size"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_80518a7052b7b18954675805e280bd2fa982c2c9dd7de5f7862064259adfc855","typeString":"literal_string \"invalid blob size\""}],"id":719,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4155:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":731,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4155:154:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":732,"nodeType":"ExpressionStatement","src":"4155:154:4"}]}},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint24","typeString":"uint24"},"id":771,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":767,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"4683:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":768,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4690:14:4","memberName":"txListByteSize","nodeType":"MemberAccess","referencedDeclaration":249,"src":"4683:21:4","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"expression":{"id":769,"name":"config","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":663,"src":"4708:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}},"id":770,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"4715:19:4","memberName":"blockMaxTxListBytes","nodeType":"MemberAccess","referencedDeclaration":219,"src":"4708:26:4","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"src":"4683:51:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"696e76616c69642074786c6973742073697a65","id":772,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"4736:21:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_c94f7eb7677d8cd931adc9a3143b48ce1e5bcdb15ec24b734dcb61ebd95ca73a","typeString":"literal_string \"invalid txlist size\""},"value":"invalid txlist size"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_c94f7eb7677d8cd931adc9a3143b48ce1e5bcdb15ec24b734dcb61ebd95ca73a","typeString":"literal_string \"invalid txlist size\""}],"id":766,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"4675:7:4","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":773,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"4675:83:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":774,"nodeType":"ExpressionStatement","src":"4675:83:4"},{"eventCall":{"arguments":[{"expression":{"id":776,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"6607:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},"id":777,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"6614:13:4","memberName":"l2BlockNumber","nodeType":"MemberAccess","referencedDeclaration":239,"src":"6607:20:4","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},{"id":778,"name":"_block","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":657,"src":"6635:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"}},{"id":779,"name":"txList","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":653,"src":"6651:6:4","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint64","typeString":"uint64"},{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata memory"},{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes memory"}],"id":775,"name":"BlockProposed","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":409,"src":"6582:13:4","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_uint256_$_t_struct$_BlockMetadata_$252_memory_ptr_$_t_bytes_memory_ptr_$returns$__$","typeString":"function (uint256,struct TaikoData.BlockMetadata memory,bytes memory)"}},"id":780,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":["6598:7:4","6629:4:4","6643:6:4"],"names":["blockId","meta","txList"],"nodeType":"FunctionCall","src":"6582:78:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":781,"nodeType":"EmitStatement","src":"6577:83:4"}]},"documentation":{"id":649,"nodeType":"StructuredDocumentation","src":"2734:235:4","text":"Proposes a Taiko L2 block.\n @param data Block parameters, currently an encoded BlockMetadata object.\n @param txList txList data if calldata is used for DA.\n @return _block The metadata of the proposed L2 block."},"implemented":true,"kind":"function","modifiers":[],"name":"_proposeBlock","nameLocation":"2983:13:4","parameters":{"id":654,"nodeType":"ParameterList","parameters":[{"constant":false,"id":651,"mutability":"mutable","name":"data","nameLocation":"3021:4:4","nodeType":"VariableDeclaration","scope":783,"src":"3006:19:4","stateVariable":false,"storageLocation":"calldata","typeDescriptions":{"typeIdentifier":"t_bytes_calldata_ptr","typeString":"bytes"},"typeName":{"id":650,"name":"bytes","nodeType":"ElementaryTypeName","src":"3006:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"},{"constant":false,"id":653,"mutability":"mutable","name":"txList","nameLocation":"3048:6:4","nodeType":"VariableDeclaration","scope":783,"src":"3035:19:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_bytes_memory_ptr","typeString":"bytes"},"typeName":{"id":652,"name":"bytes","nodeType":"ElementaryTypeName","src":"3035:5:4","typeDescriptions":{"typeIdentifier":"t_bytes_storage_ptr","typeString":"bytes"}},"visibility":"internal"}],"src":"2996:64:4"},"returnParameters":{"id":658,"nodeType":"ParameterList","parameters":[{"constant":false,"id":657,"mutability":"mutable","name":"_block","nameLocation":"3125:6:4","nodeType":"VariableDeclaration","scope":783,"src":"3094:37:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_memory_ptr","typeString":"struct TaikoData.BlockMetadata"},"typeName":{"id":656,"nodeType":"UserDefinedTypeName","pathNode":{"id":655,"name":"TaikoData.BlockMetadata","nameLocations":["3094:9:4","3104:13:4"],"nodeType":"IdentifierPath","referencedDeclaration":252,"src":"3094:23:4"},"referencedDeclaration":252,"src":"3094:23:4","typeDescriptions":{"typeIdentifier":"t_struct$_BlockMetadata_$252_storage_ptr","typeString":"struct TaikoData.BlockMetadata"}},"visibility":"internal"}],"src":"3093:39:4"},"scope":872,"stateMutability":"nonpayable","virtual":false,"visibility":"private"},{"id":798,"nodeType":"FunctionDefinition","src":"7131:513:4","nodes":[],"body":{"id":797,"nodeType":"Block","src":"7206:438:4","nodes":[],"statements":[{"expression":{"arguments":[{"hexValue":"3136375f303038","id":792,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7263:7:4","typeDescriptions":{"typeIdentifier":"t_rational_167008_by_1","typeString":"int_const 167008"},"value":"167_008"},{"hexValue":"31355f3030305f303030","id":793,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7401:10:4","typeDescriptions":{"typeIdentifier":"t_rational_15000000_by_1","typeString":"int_const 15000000"},"value":"15_000_000"},{"hexValue":"3132305f303030","id":794,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7619:7:4","typeDescriptions":{"typeIdentifier":"t_rational_120000_by_1","typeString":"int_const 120000"},"value":"120_000"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_167008_by_1","typeString":"int_const 167008"},{"typeIdentifier":"t_rational_15000000_by_1","typeString":"int_const 15000000"},{"typeIdentifier":"t_rational_120000_by_1","typeString":"int_const 120000"}],"expression":{"id":790,"name":"TaikoData","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":313,"src":"7223:9:4","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_TaikoData_$313_$","typeString":"type(library TaikoData)"}},"id":791,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"7233:6:4","memberName":"Config","nodeType":"MemberAccess","referencedDeclaration":220,"src":"7223:16:4","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_Config_$220_storage_ptr_$","typeString":"type(struct TaikoData.Config storage pointer)"}},"id":795,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"nameLocations":["7254:7:4","7383:16:4","7598:19:4"],"names":["chainId","blockMaxGasLimit","blockMaxTxListBytes"],"nodeType":"FunctionCall","src":"7223:414:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}},"functionReturnParameters":789,"id":796,"nodeType":"Return","src":"7216:421:4"}]},"documentation":{"id":784,"nodeType":"StructuredDocumentation","src":"7000:126:4","text":"@notice Gets the configuration of the TaikoL1 contract.\n @return Config struct containing configuration parameters."},"functionSelector":"c3f909d4","implemented":true,"kind":"function","modifiers":[],"name":"getConfig","nameLocation":"7140:9:4","parameters":{"id":785,"nodeType":"ParameterList","parameters":[],"src":"7149:2:4"},"returnParameters":{"id":789,"nodeType":"ParameterList","parameters":[{"constant":false,"id":788,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":798,"src":"7181:23:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config"},"typeName":{"id":787,"nodeType":"UserDefinedTypeName","pathNode":{"id":786,"name":"TaikoData.Config","nameLocations":["7181:9:4","7191:6:4"],"nodeType":"IdentifierPath","referencedDeclaration":220,"src":"7181:16:4"},"referencedDeclaration":220,"src":"7181:16:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_storage_ptr","typeString":"struct TaikoData.Config"}},"visibility":"internal"}],"src":"7180:25:4"},"scope":872,"stateMutability":"view","virtual":true,"visibility":"public"},{"id":833,"nodeType":"FunctionDefinition","src":"7650:348:4","nodes":[],"body":{"id":832,"nodeType":"Block","src":"7732:266:4","nodes":[],"statements":[{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":826,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":819,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":814,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint64","typeString":"uint64"},"id":809,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":806,"name":"config","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":801,"src":"7759:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}},"id":807,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7766:7:4","memberName":"chainId","nodeType":"MemberAccess","referencedDeclaration":215,"src":"7759:14:4","typeDescriptions":{"typeIdentifier":"t_uint64","typeString":"uint64"}},"nodeType":"BinaryOperation","operator":"<=","rightExpression":{"hexValue":"31","id":808,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7777:1:4","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7759:19:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint32","typeString":"uint32"},"id":813,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":810,"name":"config","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":801,"src":"7801:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}},"id":811,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7808:16:4","memberName":"blockMaxGasLimit","nodeType":"MemberAccess","referencedDeclaration":217,"src":"7801:23:4","typeDescriptions":{"typeIdentifier":"t_uint32","typeString":"uint32"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":812,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7828:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7801:28:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"7759:70:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint24","typeString":"uint24"},"id":818,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":815,"name":"config","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":801,"src":"7833:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}},"id":816,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7840:19:4","memberName":"blockMaxTxListBytes","nodeType":"MemberAccess","referencedDeclaration":219,"src":"7833:26:4","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":817,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7863:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7833:31:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"7759:105:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"||","rightExpression":{"commonType":{"typeIdentifier":"t_uint24","typeString":"uint24"},"id":825,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":820,"name":"config","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":801,"src":"7884:6:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config memory"}},"id":821,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberLocation":"7891:19:4","memberName":"blockMaxTxListBytes","nodeType":"MemberAccess","referencedDeclaration":219,"src":"7884:26:4","typeDescriptions":{"typeIdentifier":"t_uint24","typeString":"uint24"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"commonType":{"typeIdentifier":"t_rational_131072_by_1","typeString":"int_const 131072"},"id":824,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"leftExpression":{"hexValue":"313238","id":822,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7913:3:4","typeDescriptions":{"typeIdentifier":"t_rational_128_by_1","typeString":"int_const 128"},"value":"128"},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"31303234","id":823,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7919:4:4","typeDescriptions":{"typeIdentifier":"t_rational_1024_by_1","typeString":"int_const 1024"},"value":"1024"},"src":"7913:10:4","typeDescriptions":{"typeIdentifier":"t_rational_131072_by_1","typeString":"int_const 131072"}},"src":"7884:39:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"7759:164:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":829,"nodeType":"IfStatement","src":"7742:227:4","trueBody":{"expression":{"hexValue":"66616c7365","id":827,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"7964:5:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":805,"id":828,"nodeType":"Return","src":"7957:12:4"}},{"expression":{"hexValue":"74727565","id":830,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"7987:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":805,"id":831,"nodeType":"Return","src":"7980:11:4"}]},"functionSelector":"10f3ab1b","implemented":true,"kind":"function","modifiers":[],"name":"isConfigValid","nameLocation":"7659:13:4","parameters":{"id":802,"nodeType":"ParameterList","parameters":[{"constant":false,"id":801,"mutability":"mutable","name":"config","nameLocation":"7697:6:4","nodeType":"VariableDeclaration","scope":833,"src":"7673:30:4","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_memory_ptr","typeString":"struct TaikoData.Config"},"typeName":{"id":800,"nodeType":"UserDefinedTypeName","pathNode":{"id":799,"name":"TaikoData.Config","nameLocations":["7673:9:4","7683:6:4"],"nodeType":"IdentifierPath","referencedDeclaration":220,"src":"7673:16:4"},"referencedDeclaration":220,"src":"7673:16:4","typeDescriptions":{"typeIdentifier":"t_struct$_Config_$220_storage_ptr","typeString":"struct TaikoData.Config"}},"visibility":"internal"}],"src":"7672:32:4"},"returnParameters":{"id":805,"nodeType":"ParameterList","parameters":[{"constant":false,"id":804,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":833,"src":"7726:4:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":803,"name":"bool","nodeType":"ElementaryTypeName","src":"7726:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"7725:6:4"},"scope":872,"stateMutability":"pure","virtual":false,"visibility":"public"},{"id":871,"nodeType":"FunctionDefinition","src":"8036:501:4","nodes":[],"body":{"id":870,"nodeType":"Block","src":"8091:446:4","nodes":[],"statements":[{"assignments":[840],"declarations":[{"constant":false,"id":840,"mutability":"mutable","name":"sequencerRegistry","nameLocation":"8234:17:4","nodeType":"VariableDeclaration","scope":870,"src":"8215:36:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_contract$_ISequencerRegistry_$1007","typeString":"contract ISequencerRegistry"},"typeName":{"id":839,"nodeType":"UserDefinedTypeName","pathNode":{"id":838,"name":"ISequencerRegistry","nameLocations":["8215:18:4"],"nodeType":"IdentifierPath","referencedDeclaration":1007,"src":"8215:18:4"},"referencedDeclaration":1007,"src":"8215:18:4","typeDescriptions":{"typeIdentifier":"t_contract$_ISequencerRegistry_$1007","typeString":"contract ISequencerRegistry"}},"visibility":"internal"}],"id":847,"initialValue":{"arguments":[{"arguments":[{"hexValue":"73657175656e6365725f7265676973747279","id":843,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8293:20:4","typeDescriptions":{"typeIdentifier":"t_stringliteral_0b6572b52e65c4b2e64c609e39ff35ac6199ed070d13b170d1bfed7c267a38f0","typeString":"literal_string \"sequencer_registry\""},"value":"sequencer_registry"},{"hexValue":"74727565","id":844,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"8315:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_stringliteral_0b6572b52e65c4b2e64c609e39ff35ac6199ed070d13b170d1bfed7c267a38f0","typeString":"literal_string \"sequencer_registry\""},{"typeIdentifier":"t_bool","typeString":"bool"}],"id":842,"name":"resolve","nodeType":"Identifier","overloadedDeclarations":[2266,2285],"referencedDeclaration":2266,"src":"8285:7:4","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_bytes32_$_t_bool_$returns$_t_address_payable_$","typeString":"function (bytes32,bool) view returns (address payable)"}},"id":845,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8285:35:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address_payable","typeString":"address payable"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address_payable","typeString":"address payable"}],"id":841,"name":"ISequencerRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1007,"src":"8266:18:4","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISequencerRegistry_$1007_$","typeString":"type(contract ISequencerRegistry)"}},"id":846,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8266:55:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISequencerRegistry_$1007","typeString":"contract ISequencerRegistry"}},"nodeType":"VariableDeclarationStatement","src":"8215:106:4"},{"condition":{"commonType":{"typeIdentifier":"t_contract$_ISequencerRegistry_$1007","typeString":"contract ISequencerRegistry"},"id":855,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":848,"name":"sequencerRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":840,"src":"8335:17:4","typeDescriptions":{"typeIdentifier":"t_contract$_ISequencerRegistry_$1007","typeString":"contract ISequencerRegistry"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"arguments":[{"arguments":[{"hexValue":"30","id":852,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8383:1:4","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":851,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"8375:7:4","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":850,"name":"address","nodeType":"ElementaryTypeName","src":"8375:7:4","typeDescriptions":{}}},"id":853,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8375:10:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":849,"name":"ISequencerRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":1007,"src":"8356:18:4","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISequencerRegistry_$1007_$","typeString":"type(contract ISequencerRegistry)"}},"id":854,"isConstant":false,"isLValue":false,"isPure":true,"kind":"typeConversion","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8356:30:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISequencerRegistry_$1007","typeString":"contract ISequencerRegistry"}},"src":"8335:51:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":867,"nodeType":"IfStatement","src":"8331:179:4","trueBody":{"id":866,"nodeType":"Block","src":"8388:122:4","statements":[{"condition":{"id":861,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"8406:47:4","subExpression":{"arguments":[{"expression":{"id":858,"name":"msg","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-15,"src":"8442:3:4","typeDescriptions":{"typeIdentifier":"t_magic_message","typeString":"msg"}},"id":859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8446:6:4","memberName":"sender","nodeType":"MemberAccess","src":"8442:10:4","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"id":856,"name":"sequencerRegistry","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":840,"src":"8407:17:4","typeDescriptions":{"typeIdentifier":"t_contract$_ISequencerRegistry_$1007","typeString":"contract ISequencerRegistry"}},"id":857,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberLocation":"8425:16:4","memberName":"isEligibleSigner","nodeType":"MemberAccess","referencedDeclaration":1006,"src":"8407:34:4","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$_t_bool_$","typeString":"function (address) external returns (bool)"}},"id":860,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"nameLocations":[],"names":[],"nodeType":"FunctionCall","src":"8407:46:4","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":865,"nodeType":"IfStatement","src":"8402:98:4","trueBody":{"id":864,"nodeType":"Block","src":"8455:45:4","statements":[{"expression":{"hexValue":"66616c7365","id":862,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"8480:5:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":837,"id":863,"nodeType":"Return","src":"8473:12:4"}]}}]}},{"expression":{"hexValue":"74727565","id":868,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"8526:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":837,"id":869,"nodeType":"Return","src":"8519:11:4"}]},"implemented":true,"kind":"function","modifiers":[],"name":"_isProposerPermitted","nameLocation":"8045:20:4","parameters":{"id":834,"nodeType":"ParameterList","parameters":[],"src":"8065:2:4"},"returnParameters":{"id":837,"nodeType":"ParameterList","parameters":[{"constant":false,"id":836,"mutability":"mutable","name":"","nameLocation":"-1:-1:-1","nodeType":"VariableDeclaration","scope":871,"src":"8085:4:4","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":835,"name":"bool","nodeType":"ElementaryTypeName","src":"8085:4:4","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"8084:6:4"},"scope":872,"stateMutability":"nonpayable","virtual":false,"visibility":"private"}],"abstract":false,"baseContracts":[{"baseName":{"id":435,"name":"EssentialContract","nameLocations":["414:17:4"],"nodeType":"IdentifierPath","referencedDeclaration":2734,"src":"414:17:4"},"id":436,"nodeType":"InheritanceSpecifier","src":"414:17:4"},{"baseName":{"id":437,"name":"TaikoEvents","nameLocations":["433:11:4"],"nodeType":"IdentifierPath","referencedDeclaration":427,"src":"433:11:4"},"id":438,"nodeType":"InheritanceSpecifier","src":"433:11:4"},{"baseName":{"id":439,"name":"TaikoErrors","nameLocations":["446:11:4"],"nodeType":"IdentifierPath","referencedDeclaration":395,"src":"446:11:4"},"id":440,"nodeType":"InheritanceSpecifier","src":"446:11:4"}],"canonicalName":"TaikoL1","contractDependencies":[],"contractKind":"contract","documentation":{"id":434,"nodeType":"StructuredDocumentation","src":"375:19:4","text":"@title TaikoL1"},"fullyImplemented":true,"linearizedBaseContracts":[872,395,427,2734,2368,3441,3574,5950,3870,2774,9980,9802,9451,9461],"name":"TaikoL1","nameLocation":"403:7:4","scope":873,"usedErrors":[318,320,322,324,326,328,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394,2180,2182,2184,2190,2414,2416,2418,2420,2422],"usedEvents":[409,416,426,444,2407,2412,3352,3459,3716,9438,9445,9450]}],"license":"MIT"},"id":4} \ No newline at end of file diff --git a/bin/reth/src/commands/debug_cmd/build_block.rs b/bin/reth/src/commands/debug_cmd/build_block.rs index af42a7fa6c66..7785a0713fe2 100644 --- a/bin/reth/src/commands/debug_cmd/build_block.rs +++ b/bin/reth/src/commands/debug_cmd/build_block.rs @@ -113,6 +113,7 @@ impl Command { /// Execute `debug in-memory-merkle` command pub async fn execute(self, ctx: CliContext) -> eyre::Result<()> { + // Brecht: good end to end block building code let Environment { provider_factory, .. } = self.env.init(AccessRights::RW)?; let consensus: Arc = @@ -268,6 +269,8 @@ impl Command { let block_with_senders = SealedBlockWithSenders::new(block.clone(), senders).unwrap(); + println!("debug_cmd build"); + let db = StateProviderDatabase::new(blockchain_db.latest()?); let executor = block_executor!(provider_factory.chain_spec()).executor(db); diff --git a/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs b/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs index e362ab8d440d..dd8897bd0abd 100644 --- a/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs +++ b/bin/reth/src/commands/debug_cmd/in_memory_merkle.rs @@ -75,6 +75,7 @@ impl Command { /// Execute `debug in-memory-merkle` command pub async fn execute(self, ctx: CliContext) -> eyre::Result<()> { + println!("debug_cmd in mem"); let Environment { provider_factory, config, data_dir } = self.env.init(AccessRights::RW)?; let provider = provider_factory.provider()?; diff --git a/bin/reth/src/db.rs b/bin/reth/src/db.rs new file mode 100644 index 000000000000..dcc8b435ebc5 --- /dev/null +++ b/bin/reth/src/db.rs @@ -0,0 +1,460 @@ +use std::{ + collections::{hash_map::Entry, HashMap}, + str::FromStr, + sync::{Arc, Mutex, MutexGuard}, +}; + +use reth_primitives::{ + revm_primitives::{AccountInfo, Bytecode}, + Address, Bytes, SealedBlockWithSenders, StorageEntry, B256, U256, +}; +use reth_provider::{bundle_state::StorageRevertsIter, OriginalValuesKnown}; +use reth_revm::db::{ + states::{PlainStorageChangeset, PlainStorageRevert}, + BundleState, +}; +use rusqlite::Connection; + +/// Type used to initialize revms bundle state. +type BundleStateInit = + HashMap, Option, HashMap)>; + +/// Types used inside RevertsInit to initialize revms reverts. +pub type AccountRevertInit = (Option>, Vec); + +/// Type used to initialize revms reverts. +pub type RevertsInit = HashMap; + +pub struct Database { + connection: Arc>, +} + +impl Database { + /// Create new database with the provided connection. + pub fn new(connection: Connection) -> eyre::Result { + let database = Self { connection: Arc::new(Mutex::new(connection)) }; + database.create_tables()?; + Ok(database) + } + + fn connection(&self) -> MutexGuard<'_, Connection> { + self.connection.lock().expect("failed to acquire database lock") + } + + fn create_tables(&self) -> eyre::Result<()> { + self.connection().execute_batch( + "CREATE TABLE IF NOT EXISTS block ( + id INTEGER PRIMARY KEY, + number TEXT UNIQUE, + data TEXT + ); + CREATE TABLE IF NOT EXISTS account ( + id INTEGER PRIMARY KEY, + address TEXT UNIQUE, + data TEXT + ); + CREATE TABLE IF NOT EXISTS account_revert ( + id INTEGER PRIMARY KEY, + block_number TEXT, + address TEXT, + data TEXT, + UNIQUE (block_number, address) + ); + CREATE TABLE IF NOT EXISTS storage ( + id INTEGER PRIMARY KEY, + address TEXT, + key TEXT, + data TEXT, + UNIQUE (address, key) + ); + CREATE TABLE IF NOT EXISTS storage_revert ( + id INTEGER PRIMARY KEY, + block_number TEXT, + address TEXT, + key TEXT, + data TEXT, + UNIQUE (block_number, address, key) + ); + CREATE TABLE IF NOT EXISTS bytecode ( + id INTEGER PRIMARY KEY, + hash TEXT UNIQUE, + data TEXT + );", + )?; + Ok(()) + } + + /// Insert block with bundle into the database. + pub fn insert_block_with_bundle( + &self, + block: &SealedBlockWithSenders, + bundle: BundleState, + ) -> eyre::Result<()> { + let mut connection = self.connection(); + let tx = connection.transaction()?; + + tx.execute( + "INSERT INTO block (number, data) VALUES (?, ?)", + (block.header.number.to_string(), serde_json::to_string(block)?), + )?; + + let (changeset, reverts) = bundle.into_plain_state_and_reverts(OriginalValuesKnown::Yes); + + for (address, account) in changeset.accounts { + if let Some(account) = account { + tx.execute( + "INSERT INTO account (address, data) VALUES (?, ?) ON CONFLICT(address) DO UPDATE SET data = excluded.data", + (address.to_string(), serde_json::to_string(&account)?), + )?; + } else { + tx.execute("DELETE FROM account WHERE address = ?", (address.to_string(),))?; + } + } + + if reverts.accounts.len() > 1 { + eyre::bail!("too many blocks in account reverts"); + } + if let Some(account_reverts) = reverts.accounts.into_iter().next() { + for (address, account) in account_reverts { + tx.execute( + "INSERT INTO account_revert (block_number, address, data) VALUES (?, ?, ?) ON CONFLICT(block_number, address) DO UPDATE SET data = excluded.data", + (block.header.number.to_string(), address.to_string(), serde_json::to_string(&account)?), + )?; + } + } + + for PlainStorageChangeset { address, wipe_storage, storage } in changeset.storage { + if wipe_storage { + tx.execute("DELETE FROM storage WHERE address = ?", (address.to_string(),))?; + } + + for (key, data) in storage { + tx.execute( + "INSERT INTO storage (address, key, data) VALUES (?, ?, ?) ON CONFLICT(address, key) DO UPDATE SET data = excluded.data", + (address.to_string(), B256::from(key).to_string(), data.to_string()), + )?; + } + } + + if reverts.storage.len() > 1 { + eyre::bail!("too many blocks in storage reverts"); + } + if let Some(storage_reverts) = reverts.storage.into_iter().next() { + for PlainStorageRevert { address, wiped, storage_revert } in storage_reverts { + let storage = storage_revert + .into_iter() + .map(|(k, v)| (B256::new(k.to_be_bytes()), v)) + .collect::>(); + let wiped_storage = if wiped { get_storages(&tx, address)? } else { Vec::new() }; + for (key, data) in StorageRevertsIter::new(storage, wiped_storage) { + tx.execute( + "INSERT INTO storage_revert (block_number, address, key, data) VALUES (?, ?, ?, ?) ON CONFLICT(block_number, address, key) DO UPDATE SET data = excluded.data", + (block.header.number.to_string(), address.to_string(), key.to_string(), data.to_string()), + )?; + } + } + } + + for (hash, bytecode) in changeset.contracts { + tx.execute( + "INSERT INTO bytecode (hash, data) VALUES (?, ?) ON CONFLICT(hash) DO NOTHING", + (hash.to_string(), bytecode.bytecode().to_string()), + )?; + } + + tx.commit()?; + + Ok(()) + } + + /// Reverts the tip block from the database, checking it against the provided block number. + /// + /// The code is adapted from + pub fn revert_tip_block(&self, block_number: U256) -> eyre::Result<()> { + let mut connection = self.connection(); + let tx = connection.transaction()?; + + let tip_block_number = tx + .query_row::( + "SELECT number FROM block ORDER BY number DESC LIMIT 1", + [], + |row| row.get(0), + ) + .map(|data| U256::from_str(&data))??; + if block_number != tip_block_number { + eyre::bail!("Reverts can only be done from the tip. Attempted to revert block {} with tip block {}", block_number, tip_block_number); + } + + tx.execute("DELETE FROM block WHERE number = ?", (block_number.to_string(),))?; + + let mut state = BundleStateInit::new(); + let mut reverts = RevertsInit::new(); + + let account_reverts = tx + .prepare("SELECT address, data FROM account_revert WHERE block_number = ?")? + .query((block_number.to_string(),))? + .mapped(|row| { + Ok(( + Address::from_str(row.get_ref(0)?.as_str()?), + serde_json::from_str::>(row.get_ref(1)?.as_str()?), + )) + }) + .map(|result| { + let (address, data) = result?; + Ok((address?, data?)) + }) + .collect::>>()?; + + for (address, old_info) in account_reverts { + // insert old info into reverts + reverts.entry(address).or_default().0 = Some(old_info.clone()); + + match state.entry(address) { + Entry::Vacant(entry) => { + let new_info = get_account(&tx, address)?; + entry.insert((old_info, new_info, HashMap::new())); + } + Entry::Occupied(mut entry) => { + // overwrite old account state + entry.get_mut().0 = old_info; + } + } + } + + let storage_reverts = tx + .prepare("SELECT address, key, data FROM storage_revert WHERE block_number = ?")? + .query((block_number.to_string(),))? + .mapped(|row| { + Ok(( + Address::from_str(row.get_ref(0)?.as_str()?), + B256::from_str(row.get_ref(1)?.as_str()?), + U256::from_str(row.get_ref(2)?.as_str()?), + )) + }) + .map(|result| { + let (address, key, data) = result?; + Ok((address?, key?, data?)) + }) + .collect::>>()?; + + for (address, key, old_data) in storage_reverts.into_iter().rev() { + let old_storage = StorageEntry { key, value: old_data }; + + // insert old info into reverts + reverts.entry(address).or_default().1.push(old_storage); + + // get account state or insert from plain state + let account_state = match state.entry(address) { + Entry::Vacant(entry) => { + let present_info = get_account(&tx, address)?; + entry.insert((present_info.clone(), present_info, HashMap::new())) + } + Entry::Occupied(entry) => entry.into_mut(), + }; + + // match storage + match account_state.2.entry(old_storage.key) { + Entry::Vacant(entry) => { + let new_value = get_storage(&tx, address, old_storage.key)?.unwrap_or_default(); + entry.insert((old_storage.value, new_value)); + } + Entry::Occupied(mut entry) => { + entry.get_mut().0 = old_storage.value; + } + }; + } + + // iterate over local plain state remove all account and all storages + for (address, (old_account, new_account, storage)) in state { + // revert account if needed + if old_account != new_account { + if let Some(account) = old_account { + upsert_account(&tx, address, |_| Ok(account))?; + } else { + delete_account(&tx, address)?; + } + } + + // revert storages + for (storage_key, (old_storage_value, _new_storage_value)) in storage { + // delete previous value + delete_storage(&tx, address, storage_key)?; + + // insert value if needed + if !old_storage_value.is_zero() { + upsert_storage(&tx, address, storage_key, old_storage_value)?; + } + } + } + + tx.commit()?; + + Ok(()) + } + + /// Get block by number. + pub fn get_block(&self, number: U256) -> eyre::Result> { + let block = self.connection().query_row::( + "SELECT data FROM block WHERE number = ?", + (number.to_string(),), + |row| row.get(0), + ); + match block { + Ok(data) => Ok(Some(serde_json::from_str(&data)?)), + Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None), + Err(e) => Err(e.into()), + } + } + + /// Insert new account if it does not exist, update otherwise. The provided closure is called + /// with the current account, if it exists. + pub fn upsert_account( + &self, + address: Address, + f: impl FnOnce(Option) -> eyre::Result, + ) -> eyre::Result<()> { + upsert_account(&self.connection(), address, f) + } + + /// Get account by address. + pub fn get_account(&self, address: Address) -> eyre::Result> { + get_account(&self.connection(), address) + } +} + +/// Insert new account if it does not exist, update otherwise. The provided closure is called +/// with the current account, if it exists. Connection can be either +/// [rusqlite::Transaction] or [rusqlite::Connection]. +fn upsert_account( + connection: &Connection, + address: Address, + f: impl FnOnce(Option) -> eyre::Result, +) -> eyre::Result<()> { + let account = get_account(connection, address)?; + let account = f(account)?; + connection.execute( + "INSERT INTO account (address, data) VALUES (?, ?) ON CONFLICT(address) DO UPDATE SET data = excluded.data", + (address.to_string(), serde_json::to_string(&account)?), + )?; + + Ok(()) +} + +/// Delete account by address. Connection can be either [rusqlite::Transaction] or +/// [rusqlite::Connection]. +fn delete_account(connection: &Connection, address: Address) -> eyre::Result<()> { + connection.execute("DELETE FROM account WHERE address = ?", (address.to_string(),))?; + Ok(()) +} + +/// Get account by address using the database connection. Connection can be either +/// [rusqlite::Transaction] or [rusqlite::Connection]. +fn get_account(connection: &Connection, address: Address) -> eyre::Result> { + match connection.query_row::( + "SELECT data FROM account WHERE address = ?", + (address.to_string(),), + |row| row.get(0), + ) { + Ok(account_info) => Ok(Some(serde_json::from_str(&account_info)?)), + Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None), + Err(e) => Err(e.into()), + } +} + +/// Insert new storage if it does not exist, update otherwise. Connection can be either +/// [rusqlite::Transaction] or [rusqlite::Connection]. +fn upsert_storage( + connection: &Connection, + address: Address, + key: B256, + data: U256, +) -> eyre::Result<()> { + connection.execute( + "INSERT INTO storage (address, key, data) VALUES (?, ?, ?) ON CONFLICT(address, key) DO UPDATE SET data = excluded.data", + (address.to_string(), key.to_string(), data.to_string()), + )?; + Ok(()) +} + +/// Delete storage by address and key. Connection can be either [rusqlite::Transaction] or +/// [rusqlite::Connection]. +fn delete_storage(connection: &Connection, address: Address, key: B256) -> eyre::Result<()> { + connection.execute( + "DELETE FROM storage WHERE address = ? AND key = ?", + (address.to_string(), key.to_string()), + )?; + Ok(()) +} + +/// Get all storages for the provided address using the database connection. Connection can be +/// either [rusqlite::Transaction] or [rusqlite::Connection]. +fn get_storages(connection: &Connection, address: Address) -> eyre::Result> { + connection + .prepare("SELECT key, data FROM storage WHERE address = ?")? + .query((address.to_string(),))? + .mapped(|row| { + Ok(( + B256::from_str(row.get_ref(0)?.as_str()?), + U256::from_str(row.get_ref(1)?.as_str()?), + )) + }) + .map(|result| { + let (key, data) = result?; + Ok((key?, data?)) + }) + .collect() +} + +/// Get storage for the provided address by key using the database connection. Connection can be +/// either [rusqlite::Transaction] or [rusqlite::Connection]. +fn get_storage(connection: &Connection, address: Address, key: B256) -> eyre::Result> { + match connection.query_row::( + "SELECT data FROM storage WHERE address = ? AND key = ?", + (address.to_string(), key.to_string()), + |row| row.get(0), + ) { + Ok(data) => Ok(Some(U256::from_str(&data)?)), + Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None), + Err(e) => Err(e.into()), + } +} + +impl reth_revm::Database for Database { + type Error = eyre::Report; + + fn basic(&mut self, address: Address) -> Result, Self::Error> { + self.get_account(address) + } + + fn code_by_hash(&mut self, code_hash: B256) -> Result { + let bytecode = self.connection().query_row::( + "SELECT data FROM bytecode WHERE hash = ?", + (code_hash.to_string(),), + |row| row.get(0), + ); + match bytecode { + Ok(data) => Ok(Bytecode::new_raw(Bytes::from_str(&data).unwrap())), + Err(rusqlite::Error::QueryReturnedNoRows) => Ok(Bytecode::default()), + Err(err) => Err(err.into()), + } + } + + fn storage(&mut self, address: Address, index: U256) -> Result { + get_storage(&self.connection(), address, index.into()).map(|data| data.unwrap_or_default()) + } + + fn block_hash(&mut self, number: u64) -> Result { + let block_hash = self.connection().query_row::( + "SELECT hash FROM block WHERE number = ?", + (number.to_string(),), + |row| row.get(0), + ); + match block_hash { + Ok(data) => Ok(B256::from_str(&data).unwrap()), + // No special handling for `QueryReturnedNoRows` is needed, because revm does block + // number bound checks on its own. + // See https://github.com/bluealloy/revm/blob/1ca3d39f6a9e9778f8eb0fcb74fe529345a531b4/crates/interpreter/src/instructions/host.rs#L106-L123. + Err(err) => Err(err.into()), + } + } +} diff --git a/bin/reth/src/execution.rs b/bin/reth/src/execution.rs new file mode 100644 index 000000000000..9188ec0b20fd --- /dev/null +++ b/bin/reth/src/execution.rs @@ -0,0 +1,479 @@ +use crate::{db::Database, RollupContract, CHAIN_ID, CHAIN_SPEC}; +use alloy_consensus::{Blob, SidecarCoder, SimpleCoder}; +use alloy_rlp::Decodable as _; +use eyre::OptionExt; +use reth::transaction_pool::TransactionPool; +use reth_execution_errors::BlockValidationError; +use reth_node_api::{ConfigureEvm, ConfigureEvmEnv}; +use reth_node_ethereum::EthEvmConfig; +use reth_primitives::{ + constants, + eip4844::kzg_to_versioned_hash, + keccak256, + revm_primitives::{CfgEnvWithHandlerCfg, EVMError, ExecutionResult, ResultAndState}, + Address, Block, BlockWithSenders, Bytes, EthereumHardfork, Header, Receipt, TransactionSigned, + TxType, B256, U256, +}; +use reth_revm::{ + db::{states::bundle_state::BundleRetention, BundleState}, + DBBox, DatabaseCommit, Evm, StateBuilder, StateDBBox, +}; +use reth_tracing::tracing::debug; + +/// Execute a rollup block and return (block with recovered senders)[BlockWithSenders], (bundle +/// state)[BundleState] and list of (receipts)[Receipt]. +pub async fn execute_block( + db: &mut Database, + pool: &Pool, + tx: &TransactionSigned, + block_metadata: &RollupContract::BlockMetadata, + block_data: Bytes, + //block_data_hash: B256, +) -> eyre::Result<(BlockWithSenders, BundleState, Vec, Vec)> { + //if header.rollupChainId != U256::from(CHAIN_ID) { + // eyre::bail!("Invalid rollup chain ID") + //} + + // Construct header + let header = construct_header(db, block_metadata)?; + + // Decode transactions + let transactions = decode_transactions(pool, tx, block_data).await?; + + // Configure EVM + let evm_config = EthEvmConfig::default(); + let mut evm = configure_evm(&evm_config, db, &header); + + // Execute transactions + let (executed_txs, receipts, results) = execute_transactions(&mut evm, &header, transactions)?; + + // Construct block and recover senders + let block = Block { header, body: executed_txs, ..Default::default() } + .with_recovered_senders() + .ok_or_eyre("failed to recover senders")?; + + let bundle = evm.db_mut().take_bundle(); + + Ok((block, bundle, receipts, results)) +} + +/// Construct header from the given rollup header. +fn construct_header(db: &Database, meta_data: &RollupContract::BlockMetadata) -> eyre::Result
{ + let parent_block = db.get_block((meta_data.l2BlockNumber - 1).try_into().unwrap())?; + + let block_number = u64::try_from(meta_data.l2BlockNumber)?; + + // Calculate base fee per gas for EIP-1559 transactions + let base_fee_per_gas = + if CHAIN_SPEC.fork(EthereumHardfork::London).transitions_at_block(block_number) { + constants::EIP1559_INITIAL_BASE_FEE + } else { + parent_block + .as_ref() + .ok_or(eyre::eyre!("parent block not found"))? + .header + .next_block_base_fee(CHAIN_SPEC.base_fee_params_at_block(block_number)) + .ok_or(eyre::eyre!("failed to calculate base fee"))? + }; + + // Construct header + Ok(Header { + parent_hash: parent_block.map(|block| block.header.hash()).unwrap_or_default(), + number: block_number, + gas_limit: u64::try_from(meta_data.gasLimit)?, + timestamp: u64::try_from(meta_data.timestamp)?, + base_fee_per_gas: Some(base_fee_per_gas), + ..Default::default() + }) +} + +/// Configure EVM with the given database and header. +fn configure_evm<'a>( + config: &'a EthEvmConfig, + db: &'a mut Database, + header: &Header, +) -> Evm<'a, (), StateDBBox<'a, eyre::Report>> { + let mut evm = config.evm( + StateBuilder::new_with_database(Box::new(db) as DBBox<'_, eyre::Report>) + .with_bundle_update() + .build(), + ); + evm.db_mut().set_state_clear_flag( + CHAIN_SPEC.fork(EthereumHardfork::SpuriousDragon).active_at_block(header.number), + ); + + let mut cfg = CfgEnvWithHandlerCfg::new_with_spec_id(evm.cfg().clone(), evm.spec_id()); + config.fill_cfg_and_block_env(&mut cfg, evm.block_mut(), &CHAIN_SPEC, header, U256::ZERO); + *evm.cfg_mut() = cfg.cfg_env; + + evm +} + +/// Decode transactions from the block data and recover senders. +/// - If the transaction is a blob-carrying one, decode the blobs either using the local transaction +/// pool, or querying Blobscan. +/// - If the transaction is a regular one, decode the block data directly. +async fn decode_transactions( + pool: &Pool, + tx: &TransactionSigned, + block_data: Bytes, + //block_data_hash: B256, +) -> eyre::Result> { + // Get raw transactions either from the blobs, or directly from the block data + let raw_transactions = if matches!(tx.tx_type(), TxType::Eip4844) { + let blobs: Vec<_> = if let Some(sidecar) = pool.get_blob(tx.hash)? { + // Try to get blobs from the transaction pool + sidecar.blobs.into_iter().zip(sidecar.commitments).collect() + } else { + // If transaction is not found in the pool, try to get blobs from Blobscan + let blobscan_client = foundry_blob_explorers::Client::holesky(); + let sidecar = blobscan_client.transaction(tx.hash).await?.blob_sidecar(); + sidecar + .blobs + .into_iter() + .map(|blob| (*blob).into()) + .zip(sidecar.commitments.into_iter().map(|commitment| (*commitment).into())) + .collect() + }; + + // Decode blob hashes from block data + let blob_hashes = Vec::::decode(&mut block_data.as_ref())?; + + // Filter blobs that are present in the block data + let blobs = blobs + .into_iter() + // Convert blob KZG commitments to versioned hashes + .map(|(blob, commitment)| (blob, kzg_to_versioned_hash(commitment.as_slice()))) + // Filter only blobs that are present in the block data + .filter(|(_, hash)| blob_hashes.contains(hash)) + .map(|(blob, _)| Blob::from(*blob)) + .collect::>(); + if blobs.len() != blob_hashes.len() { + eyre::bail!("some blobs not found") + } + + // Decode blobs and concatenate them to get the raw transactions + let data = SimpleCoder::default() + .decode_all(&blobs) + .ok_or(eyre::eyre!("failed to decode blobs"))? + .concat(); + + data.into() + } else { + block_data + }; + + //let raw_transaction_hash = keccak256(&raw_transactions); + //if raw_transaction_hash != block_data_hash { + // eyre::bail!("block data hash mismatch") + //} + + // Decode block data, filter only transactions with the correct chain ID and recover senders + let transactions = Vec::::decode(&mut raw_transactions.as_ref())? + .into_iter() + .filter(|tx| tx.chain_id() == Some(CHAIN_ID)) + .map(|tx| { + let sender = tx.recover_signer().ok_or(eyre::eyre!("failed to recover signer"))?; + Ok((tx, sender)) + }) + .collect::>()?; + + Ok(transactions) +} + +/// Execute transactions and return the list of executed transactions, receipts and +/// execution results. +fn execute_transactions( + evm: &mut Evm<'_, (), StateDBBox<'_, eyre::Report>>, + header: &Header, + transactions: Vec<(TransactionSigned, Address)>, +) -> eyre::Result<(Vec, Vec, Vec)> { + let mut receipts = Vec::with_capacity(transactions.len()); + let mut executed_txs = Vec::with_capacity(transactions.len()); + let mut results = Vec::with_capacity(transactions.len()); + if !transactions.is_empty() { + let mut cumulative_gas_used = 0; + for (transaction, sender) in transactions { + // The sum of the transaction’s gas limit, Tg, and the gas utilized in this block prior, + // must be no greater than the block’s gasLimit. + let block_available_gas = header.gas_limit - cumulative_gas_used; + if transaction.gas_limit() > block_available_gas { + return Err(BlockValidationError::TransactionGasLimitMoreThanAvailableBlockGas { + transaction_gas_limit: transaction.gas_limit(), + block_available_gas, + } + .into()); + } + // Execute transaction. + // Fill revm structure. + EthEvmConfig::default().fill_tx_env(evm.tx_mut(), &transaction, sender); + + let ResultAndState { result, state } = match evm.transact() { + Ok(result) => result, + Err(err) => { + match err { + EVMError::Transaction(err) => { + // if the transaction is invalid, we can skip it + debug!(%err, ?transaction, "Skipping invalid transaction"); + continue; + } + err => { + // this is an error that we should treat as fatal for this attempt + eyre::bail!(err) + } + } + } + }; + + debug!(?transaction, ?result, ?state, "Executed transaction"); + + evm.db_mut().commit(state); + + // append gas used + cumulative_gas_used += result.gas_used(); + + // Push transaction changeset and calculate header bloom filter for receipt. + #[allow(clippy::needless_update)] // side-effect of optimism fields + receipts.push(Receipt { + tx_type: transaction.tx_type(), + success: result.is_success(), + cumulative_gas_used, + logs: result.logs().iter().cloned().map(Into::into).collect(), + ..Default::default() + }); + + // append transaction to the list of executed transactions + executed_txs.push(transaction); + results.push(result); + } + + evm.db_mut().merge_transitions(BundleRetention::Reverts); + } + + Ok((executed_txs, receipts, results)) +} + +/* +#[cfg(test)] +mod tests { + use std::time::{SystemTime, UNIX_EPOCH}; + + use alloy_consensus::{SidecarBuilder, SimpleCoder}; + use alloy_sol_types::{sol, SolCall}; + use reth::transaction_pool::{ + test_utils::{testing_pool, MockTransaction}, + TransactionOrigin, TransactionPool, + }; + use reth_primitives::{ + bytes, + constants::ETH_TO_WEI, + keccak256, public_key_to_address, + revm_primitives::{AccountInfo, ExecutionResult, Output, TxEnv}, + BlockNumber, Receipt, SealedBlockWithSenders, Transaction, TxEip2930, TxKind, U256, + }; + use reth_revm::Evm; + use reth_testing_utils::generators::{self, sign_tx_with_key_pair}; + use rusqlite::Connection; + use secp256k1::{Keypair, Secp256k1}; + + use crate::{ + db::Database, execute_block, RollupContract::BlockMetadata, CHAIN_ID, + ROLLUP_SUBMITTER_ADDRESS, + }; + + sol!( + WETH, + r#" +[ + { + "constant":true, + "inputs":[ + { + "name":"", + "type":"address" + } + ], + "name":"balanceOf", + "outputs":[ + { + "name":"", + "type":"uint256" + } + ], + "payable":false, + "stateMutability":"view", + "type":"function" + } +] + "# + ); + + #[tokio::test] + async fn test_execute_block() -> eyre::Result<()> { + reth_tracing::init_test_tracing(); + + let mut database = Database::new(Connection::open_in_memory()?)?; + + // Create key pair + let secp = Secp256k1::new(); + let key_pair = Keypair::new(&secp, &mut generators::rng()); + let sender_address = public_key_to_address(key_pair.public_key()); + + // Deposit some ETH to the sender and insert it into database + database.upsert_account(sender_address, |_| { + Ok(AccountInfo { balance: U256::from(ETH_TO_WEI), nonce: 1, ..Default::default() }) + })?; + + // WETH deployment transaction sent using calldata + let (_, _, results) = execute_transaction( + &mut database, + key_pair, + 0, + Transaction::Eip2930(TxEip2930 { + chain_id: CHAIN_ID, + nonce: 1, + gas_limit: 1_500_000, + gas_price: 1_500_000_000, + to: TxKind::Create, + // WETH9 bytecode + input: bytes!("60606040526040805190810160405280600d81526020017f57726170706564204574686572000000000000000000000000000000000000008152506000908051906020019061004f9291906100c8565b506040805190810160405280600481526020017f57455448000000000000000000000000000000000000000000000000000000008152506001908051906020019061009b9291906100c8565b506012600260006101000a81548160ff021916908360ff16021790555034156100c357600080fd5b61016d565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061010957805160ff1916838001178555610137565b82800160010185558215610137579182015b8281111561013657825182559160200191906001019061011b565b5b5090506101449190610148565b5090565b61016a91905b8082111561016657600081600090555060010161014e565b5090565b90565b610c348061017c6000396000f3006060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"), + ..Default::default() + }), + BlockDataSource::Calldata + ).await?; + + let weth_address = match results.first() { + Some(ExecutionResult::Success { output: Output::Create(_, Some(address)), .. }) => { + *address + } + _ => eyre::bail!("WETH contract address not found"), + }; + + // WETH deposit transaction sent using blobs + execute_transaction( + &mut database, + key_pair, + 1, + Transaction::Eip2930(TxEip2930 { + chain_id: CHAIN_ID, + nonce: 2, + gas_limit: 50000, + gas_price: 1_500_000_000, + to: TxKind::Call(weth_address), + value: U256::from(0.5 * ETH_TO_WEI as f64), + input: bytes!("d0e30db0"), + ..Default::default() + }), + BlockDataSource::Blobs, + ) + .await?; + + // Verify WETH balance + let mut evm = Evm::builder() + .with_db(&mut database) + .with_tx_env(TxEnv { + caller: sender_address, + gas_limit: 50_000_000, + transact_to: TxKind::Call(weth_address), + data: WETH::balanceOfCall::new((sender_address,)).abi_encode().into(), + ..Default::default() + }) + .build(); + let result = evm.transact().map_err(|err| eyre::eyre!(err))?.result; + assert_eq!( + result.output(), + Some(&U256::from(0.5 * ETH_TO_WEI as f64).to_be_bytes_vec().into()) + ); + drop(evm); + + // Verify nonce + let account = database.get_account(sender_address)?.unwrap(); + assert_eq!(account.nonce, 3); + + // Revert block with WETH deposit transaction + database.revert_tip_block(U256::from(1))?; + + // Verify WETH balance after revert + let mut evm = Evm::builder() + .with_db(&mut database) + .with_tx_env(TxEnv { + caller: sender_address, + gas_limit: 50_000_000, + transact_to: TxKind::Call(weth_address), + data: WETH::balanceOfCall::new((sender_address,)).abi_encode().into(), + ..Default::default() + }) + .build(); + let result = evm.transact().map_err(|err| eyre::eyre!(err))?.result; + assert_eq!(result.output(), Some(&U256::ZERO.to_be_bytes_vec().into())); + drop(evm); + + // Verify nonce after revert + let account = database.get_account(sender_address)?.unwrap(); + assert_eq!(account.nonce, 2); + + Ok(()) + } + + enum BlockDataSource { + Calldata, + Blobs, + } + + async fn execute_transaction( + database: &mut Database, + key_pair: Keypair, + sequence: BlockNumber, + tx: Transaction, + block_data_source: BlockDataSource, + ) -> eyre::Result<(SealedBlockWithSenders, Vec, Vec)> { + // Construct block header + /*let block_header = BlockHeader { + rollupChainId: U256::from(CHAIN_ID), + sequence: U256::from(sequence), + confirmBy: U256::from(SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs()), + gasLimit: U256::from(30_000_000), + rewardAddress: ROLLUP_SUBMITTER_ADDRESS, + };*/ + let encoded_transactions = + alloy_rlp::encode(vec![sign_tx_with_key_pair(key_pair, tx).envelope_encoded()]); + let block_data_hash = keccak256(&encoded_transactions); + + let pool = testing_pool(); + + let (block_data, l1_transaction) = match block_data_source { + BlockDataSource::Calldata => ( + encoded_transactions, + sign_tx_with_key_pair(key_pair, Transaction::Eip2930(TxEip2930::default())), + ), + BlockDataSource::Blobs => { + let sidecar = + SidecarBuilder::::from_slice(&encoded_transactions).build()?; + let blob_hashes = alloy_rlp::encode(sidecar.versioned_hashes().collect::>()); + + let mut mock_transaction = MockTransaction::eip4844_with_sidecar(sidecar); + let transaction = + sign_tx_with_key_pair(key_pair, Transaction::from(mock_transaction.clone())); + mock_transaction.set_hash(transaction.hash); + pool.add_transaction(TransactionOrigin::Local, mock_transaction).await?; + (blob_hashes, transaction) + } + }; + + // Execute block and insert into database + let (block, bundle, receipts, results) = execute_block( + database, + &pool, + &l1_transaction, + &block_header, + block_data.into(), + //block_data_hash, + ) + .await?; + let block = block.seal_slow(); + database.insert_block_with_bundle(&block, bundle)?; + + Ok((block, receipts, results)) + } +} +*/ \ No newline at end of file diff --git a/bin/reth/src/main.rs b/bin/reth/src/main.rs index 4eacb9df3f2d..89393a355118 100644 --- a/bin/reth/src/main.rs +++ b/bin/reth/src/main.rs @@ -5,7 +5,7 @@ #[global_allocator] static ALLOC: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc; -#[cfg(all(feature = "optimism", not(test)))] +/*#[cfg(all(feature = "optimism", not(test)))] compile_error!("Cannot build the `reth` binary with the `optimism` feature flag enabled. Did you mean to build `op-reth`?"); #[cfg(not(feature = "optimism"))] @@ -27,4 +27,313 @@ fn main() { eprintln!("Error: {err:?}"); std::process::exit(1); } +}*/ + +use alloy_sol_types::{sol, SolEventInterface, SolInterface}; +use db::Database; +use execution::execute_block; +use once_cell::sync::Lazy; +use reth::{args::{DiscoveryArgs, NetworkArgs, RpcServerArgs}, builder::{NodeBuilder, NodeConfig, NodeHandle}, rpc::api::EngineApiClient, tasks::TaskManager}; +use reth_chainspec::{ChainSpec, ChainSpecBuilder}; +use reth_execution_types::Chain; +use reth_exex::{ExExContext, ExExEvent}; +use reth_node_api::FullNodeComponents; +use reth_node_ethereum::EthereumNode; +use reth_primitives::{address, Address, Genesis, SealedBlockWithSenders, TransactionSigned, U256}; +use reth_tracing::tracing::{error, info}; +use rusqlite::Connection; +use std::sync::Arc; + +mod db; +mod execution; + +sol!(RollupContract, "TaikoL1.json"); +use RollupContract::{BlockProposed, RollupContractCalls, RollupContractEvents}; + +const DATABASE_PATH: &str = "rollup.db"; +const ROLLUP_CONTRACT_ADDRESS: Address = address!("9fCF7D13d10dEdF17d0f24C62f0cf4ED462f65b7"); +const ROLLUP_SUBMITTER_ADDRESS: Address = address!("8943545177806ED17B9F23F0a21ee5948eCaa776"); +const CHAIN_ID: u64 = 160010; +static CHAIN_SPEC: Lazy> = Lazy::new(|| { + Arc::new( + ChainSpecBuilder::default() + .chain(CHAIN_ID.into()) + .genesis(Genesis::clique_genesis(CHAIN_ID, ROLLUP_SUBMITTER_ADDRESS)) + .shanghai_activated() + .build(), + ) +}); + +struct Rollup { + ctx: ExExContext, + db: Database, +} + +impl Rollup { + fn new(ctx: ExExContext, connection: Connection) -> eyre::Result { + let db = Database::new(connection)?; + Ok(Self { ctx, db }) + } + + async fn start(mut self) -> eyre::Result<()> { + // Process all new chain state notifications + while let Some(notification) = self.ctx.notifications.recv().await { + if let Some(reverted_chain) = notification.reverted_chain() { + self.revert(&reverted_chain)?; + } + + if let Some(committed_chain) = notification.committed_chain() { + self.commit(&committed_chain).await?; + self.ctx.events.send(ExExEvent::FinishedHeight(committed_chain.tip().number))?; + } + } + + Ok(()) + } + + /// Process a new chain commit. + /// + /// This function decodes all transactions to the rollup contract into events, executes the + /// corresponding actions and inserts the results into the database. + async fn commit(&mut self, chain: &Chain) -> eyre::Result<()> { + let events = decode_chain_into_rollup_events(chain); + println!("Found {:?} events", events.len()); + + for (_, tx, event) in events { + match event { + // A new block is submitted to the rollup contract. + // The block is executed on top of existing rollup state and committed into the + // database. + RollupContractEvents::BlockProposed(BlockProposed { + blockId: block_number, + meta: block_metadata, + txList: tx_list, + }) => { + println!("block_number: {:?}", block_number); + println!("tx_list: {:?}", tx_list); + let call = RollupContractCalls::abi_decode(tx.input(), true)?; + + /*if let RollupContractCalls::submitBlock(RollupContract::submitBlockCall { + header, + blockData, + .. + }) = call + {*/ + match execute_block( + &mut self.db, + self.ctx.pool(), + tx, + &block_metadata, + tx_list, + //blockDataHash, + ) + .await + { + Ok((block, bundle, _, _)) => { + let block = block.seal_slow(); + self.db.insert_block_with_bundle(&block, bundle)?; + info!( + tx_hash = %tx.recalculate_hash(), + chain_id = %CHAIN_ID, + sequence = %block_metadata.l2BlockNumber, + transactions = block.body.len(), + "Block submitted, executed and inserted into database" + ); + } + Err(err) => { + error!( + %err, + tx_hash = %tx.recalculate_hash(), + chain_id = %CHAIN_ID, + sequence = %block_metadata.l2BlockNumber, + "Failed to execute block" + ); + } + } + //} + } + // A deposit of ETH to the rollup contract. The deposit is added to the recipient's + // balance and committed into the database. + /*RollupContractEvents::Enter(RollupContract::Enter { + rollupChainId, + token, + rollupRecipient, + amount, + }) => { + if rollupChainId != U256::from(CHAIN_ID) { + error!(tx_hash = %tx.recalculate_hash(), "Invalid rollup chain ID"); + continue; + } + if token != Address::ZERO { + error!(tx_hash = %tx.recalculate_hash(), "Only ETH deposits are supported"); + continue; + } + + self.db.upsert_account(rollupRecipient, |account| { + let mut account = account.unwrap_or_default(); + account.balance += amount; + Ok(account) + })?; + + info!( + tx_hash = %tx.recalculate_hash(), + %amount, + recipient = %rollupRecipient, + "Deposit", + ); + }*/ + _ => (), + } + } + + Ok(()) + } + + /// Process a chain revert. + /// + /// This function decodes all transactions to the rollup contract into events, reverts the + /// corresponding actions and updates the database. + fn revert(&mut self, chain: &Chain) -> eyre::Result<()> { + let mut events = decode_chain_into_rollup_events(chain); + // Reverse the order of events to start reverting from the tip + events.reverse(); + + /*for (_, tx, event) in events { + match event { + // The block is reverted from the database. + RollupContractEvents::BlockSubmitted(_) => { + let call = RollupContractCalls::abi_decode(tx.input(), true)?; + + if let RollupContractCalls::submitBlock(RollupContract::submitBlockCall { + header, + .. + }) = call + { + self.db.revert_tip_block(header.sequence)?; + info!( + tx_hash = %tx.recalculate_hash(), + chain_id = %header.rollupChainId, + sequence = %header.sequence, + "Block reverted" + ); + } + } + // The deposit is subtracted from the recipient's balance. + RollupContractEvents::Enter(RollupContract::Enter { + rollupChainId, + token, + rollupRecipient, + amount, + }) => { + if rollupChainId != U256::from(CHAIN_ID) { + error!(tx_hash = %tx.recalculate_hash(), "Invalid rollup chain ID"); + continue; + } + if token != Address::ZERO { + error!(tx_hash = %tx.recalculate_hash(), "Only ETH deposits are supported"); + continue; + } + + self.db.upsert_account(rollupRecipient, |account| { + let mut account = account.ok_or(eyre::eyre!("account not found"))?; + account.balance -= amount; + Ok(account) + })?; + + info!( + tx_hash = %tx.recalculate_hash(), + %amount, + recipient = %rollupRecipient, + "Deposit reverted", + ); + } + _ => (), + } + }*/ + + Ok(()) + } +} + +/// Decode chain of blocks into a flattened list of receipt logs, filter only transactions to the +/// Rollup contract [ROLLUP_CONTRACT_ADDRESS] and extract [RollupContractEvents]. +fn decode_chain_into_rollup_events( + chain: &Chain, +) -> Vec<(&SealedBlockWithSenders, &TransactionSigned, RollupContractEvents)> { + chain + // Get all blocks and receipts + .blocks_and_receipts() + // Get all receipts + .flat_map(|(block, receipts)| { + block + .body + .iter() + .zip(receipts.iter().flatten()) + .map(move |(tx, receipt)| (block, tx, receipt)) + }) + // Get all logs from rollup contract + .flat_map(|(block, tx, receipt)| { + receipt + .logs + .iter() + .filter(|log| log.address == ROLLUP_CONTRACT_ADDRESS) + .map(move |log| (block, tx, log)) + }) + // Decode and filter rollup events + .filter_map(|(block, tx, log)| { + RollupContractEvents::decode_raw_log(log.topics(), &log.data.data, true) + .ok() + .map(|event| (block, tx, event)) + }) + .collect() +} + +fn main() -> eyre::Result<()> { + println!("Brecht"); + reth::cli::Cli::parse_args().run(|builder, _| async move { + let handle = builder + .node(EthereumNode::default()) + .install_exex("Rollup", move |ctx| async { + let connection = Connection::open(DATABASE_PATH)?; + + /*let network_config = NetworkArgs { + discovery: DiscoveryArgs { disable_discovery: true, ..DiscoveryArgs::default() }, + ..NetworkArgs::default() + }; + + let tasks = TaskManager::current(); + let exec = tasks.executor(); + + let node_config = NodeConfig::test() + .with_chain(CHAIN_SPEC.clone()) + .with_network(network_config.clone()) + .with_unused_ports() + .with_rpc(RpcServerArgs::default().with_unused_ports().with_http()) + .set_dev(true); + + let NodeHandle { node, node_exit_future: _ } = NodeBuilder::new(node_config.clone()) + .testing_node(exec.clone()) + .node(Default::default()) + .launch() + .await?; + + // setup payload for submission + let envelope_v3: ::ExecutionPayloadV3 = payload.into(); + + // submit payload to engine api + let submission = EngineApiClient::::new_payload_v3( + &self.engine_api_client, + envelope_v3.execution_payload(), + versioned_hashes, + payload_builder_attributes.parent_beacon_block_root().unwrap(), + ) + .await?;*/ + + Ok(Rollup::new(ctx, connection)?.start()) + }) + .launch() + .await?; + + 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 b41e4dbbffba..c07ae576c60b 100644 --- a/crates/blockchain-tree/src/blockchain_tree.rs +++ b/crates/blockchain-tree/src/blockchain_tree.rs @@ -1020,6 +1020,7 @@ where &mut self, block_hash: BlockHash, ) -> Result { + // Brecht reorg make_canonical let mut durations_recorder = MakeCanonicalDurationsRecorder::default(); let old_block_indices = self.block_indices().clone(); @@ -1213,6 +1214,7 @@ where chain: Chain, recorder: &mut MakeCanonicalDurationsRecorder, ) -> 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(); diff --git a/crates/blockchain-tree/src/chain.rs b/crates/blockchain-tree/src/chain.rs index dbc0c1d04b5f..5eca9c78933f 100644 --- a/crates/blockchain-tree/src/chain.rs +++ b/crates/blockchain-tree/src/chain.rs @@ -180,6 +180,7 @@ impl AppendableChain { DB: Database + Clone, E: BlockExecutorProvider, { + println!("validate_and_execute"); // some checks are done before blocks comes here. externals.consensus.validate_header_against_parent(&block, parent_block)?; diff --git a/crates/cli/commands/src/common.rs b/crates/cli/commands/src/common.rs index b382f7312cac..80b9ee9316d0 100644 --- a/crates/cli/commands/src/common.rs +++ b/crates/cli/commands/src/common.rs @@ -55,6 +55,7 @@ impl EnvironmentArgs { /// Initializes environment according to [`AccessRights`] and returns an instance of /// [`Environment`]. pub fn init(&self, access: AccessRights) -> eyre::Result { + println!("EnvironmentArgs::init"); let data_dir = self.datadir.clone().resolve_datadir(self.chain.chain); let db_path = data_dir.db(); let sf_path = data_dir.static_files(); diff --git a/crates/cli/commands/src/node.rs b/crates/cli/commands/src/node.rs index 233a7d5b3a4a..b8cf2a33a678 100644 --- a/crates/cli/commands/src/node.rs +++ b/crates/cli/commands/src/node.rs @@ -134,6 +134,7 @@ impl NodeCommand { L: FnOnce(WithLaunchContext>>, Ext) -> Fut, Fut: Future>, { + println!("NodeCommand::execute"); tracing::info!(target: "reth::cli", version = ?version::SHORT_VERSION, "Starting reth"); let Self { diff --git a/crates/cli/commands/src/stage/dump/mod.rs b/crates/cli/commands/src/stage/dump/mod.rs index 7366ff9981e0..8308bd7fe865 100644 --- a/crates/cli/commands/src/stage/dump/mod.rs +++ b/crates/cli/commands/src/stage/dump/mod.rs @@ -116,6 +116,7 @@ pub(crate) fn setup( output_db: &PathBuf, db_tool: &DbTool, ) -> eyre::Result<(DatabaseEnv, u64)> { + println!("chain setup"); assert!(from < to, "FROM block should be bigger than TO block."); info!(target: "reth::cli", ?output_db, "Creating separate db"); diff --git a/crates/consensus/auto-seal/src/lib.rs b/crates/consensus/auto-seal/src/lib.rs index c37277c068e3..38b30bfba63e 100644 --- a/crates/consensus/auto-seal/src/lib.rs +++ b/crates/consensus/auto-seal/src/lib.rs @@ -346,6 +346,8 @@ impl StorageInner { Executor: BlockExecutorProvider, Provider: StateProviderFactory, { + println!("build_and_execute"); + let timestamp = SystemTime::now().duration_since(UNIX_EPOCH).unwrap_or_default().as_secs(); // if shanghai is active, include empty withdrawals diff --git a/crates/consensus/beacon/src/engine/handle.rs b/crates/consensus/beacon/src/engine/handle.rs index aee554f8241a..d29925ad4f1b 100644 --- a/crates/consensus/beacon/src/engine/handle.rs +++ b/crates/consensus/beacon/src/engine/handle.rs @@ -49,8 +49,11 @@ where cancun_fields: Option, ) -> Result { let (tx, rx) = oneshot::channel(); + println!("new_payload start"); let _ = self.to_engine.send(BeaconEngineMessage::NewPayload { payload, cancun_fields, tx }); - rx.await.map_err(|_| BeaconOnNewPayloadError::EngineUnavailable)? + let res = rx.await.map_err(|_| BeaconOnNewPayloadError::EngineUnavailable)?; + println!("new_payload end"); + res } /// Sends a forkchoice update message to the beacon consensus engine and waits for a response. diff --git a/crates/consensus/beacon/src/engine/mod.rs b/crates/consensus/beacon/src/engine/mod.rs index 0e9f91ac6585..5defdb336dd7 100644 --- a/crates/consensus/beacon/src/engine/mod.rs +++ b/crates/consensus/beacon/src/engine/mod.rs @@ -1601,6 +1601,7 @@ where match action { BlockchainTreeAction::MakeForkchoiceHeadCanonical { state, attrs, tx } => { let start = Instant::now(); + // Brecht: reorg let result = self.blockchain.make_canonical(state.head_block_hash); let elapsed = self.record_make_canonical_latency(start, &result); match self @@ -2212,6 +2213,7 @@ mod tests { assert_matches!(engine_rx.try_recv(), Err(TryRecvError::Empty)); } + // Brecht fork choice update #[tokio::test] async fn valid_forkchoice() { let mut rng = generators::rng(); diff --git a/crates/e2e-test-utils/src/lib.rs b/crates/e2e-test-utils/src/lib.rs index 5cc6850106d7..c6c04db690cc 100644 --- a/crates/e2e-test-utils/src/lib.rs +++ b/crates/e2e-test-utils/src/lib.rs @@ -13,7 +13,7 @@ use reth_node_builder::{ components::NodeComponentsBuilder, rpc::EthApiBuilderProvider, FullNodeTypesAdapter, Node, NodeAdapter, NodeAddOns, RethFullAdapter, }; -use reth_provider::providers::BlockchainProvider; +use reth_provider::{providers::BlockchainProvider, StateProviderFactory}; use tracing::{span, Level}; use wallet::Wallet; @@ -78,6 +78,8 @@ where .launch() .await?; + //node.state_by_block_id(block_id) + let mut node = NodeTestContext::new(node).await?; // Connect each node in a chain. diff --git a/crates/e2e-test-utils/src/node.rs b/crates/e2e-test-utils/src/node.rs index 05d0a5f97854..3bd203277ac6 100644 --- a/crates/e2e-test-utils/src/node.rs +++ b/crates/e2e-test-utils/src/node.rs @@ -138,8 +138,11 @@ where ::ExecutionPayloadV3: From<::BuiltPayload> + PayloadEnvelopeExt, { + println!("new payload start"); let (payload, eth_attr) = self.new_payload(attributes_generator).await?; + println!("new payload stop"); + println!("submit payload"); let block_hash = self .engine_api .submit_payload( @@ -149,9 +152,12 @@ where versioned_hashes, ) .await?; + println!("submit payload done"); + println!("update_forkchoice"); // trigger forkchoice update via engine api to commit the block to the blockchain self.engine_api.update_forkchoice(block_hash, block_hash).await?; + println!("update_forkchoice done"); Ok((payload, eth_attr)) } diff --git a/crates/engine/tree/src/tree/mod.rs b/crates/engine/tree/src/tree/mod.rs index 69e14bf7b8c2..c83fbb52bff6 100644 --- a/crates/engine/tree/src/tree/mod.rs +++ b/crates/engine/tree/src/tree/mod.rs @@ -374,6 +374,7 @@ where } }, FromEngine::Request(request) => match request { + // Brecht: fork choice update BeaconEngineMessage::ForkchoiceUpdated { state, payload_attrs, tx } => { let output = self.on_forkchoice_updated(state, payload_attrs); @@ -682,6 +683,8 @@ where &mut self, block: SealedBlockWithSenders, ) -> Result { + println!("insert_block_inner"); + if self.block_by_hash(block.hash())?.is_some() { let attachment = BlockAttachment::Canonical; // TODO: remove or revise attachment return Ok(InsertPayloadOk::AlreadySeen(BlockStatus::Valid(attachment))) diff --git a/crates/ethereum/evm/src/execute.rs b/crates/ethereum/evm/src/execute.rs index cfee186c6334..fc077b86290e 100644 --- a/crates/ethereum/evm/src/execute.rs +++ b/crates/ethereum/evm/src/execute.rs @@ -69,6 +69,7 @@ where where DB: Database>, { + println!("eth_executor"); EthBlockExecutor::new( self.chain_spec.clone(), self.evm_config.clone(), @@ -91,6 +92,7 @@ where where DB: Database + Display>, { + println!("executor"); self.eth_executor(db) } @@ -98,6 +100,7 @@ where where DB: Database + Display>, { + println!("batch_executor"); let executor = self.eth_executor(db); EthBatchExecutor { executor, @@ -254,7 +257,8 @@ pub struct EthBlockExecutor { impl EthBlockExecutor { /// Creates a new Ethereum block executor. - pub const fn new(chain_spec: Arc, evm_config: EvmConfig, state: State) -> Self { + pub fn new(chain_spec: Arc, evm_config: EvmConfig, state: State) -> Self { + println!("EthBlockExecutor::new"); Self { executor: EthEvmExecutor { chain_spec, evm_config }, state } } @@ -305,6 +309,8 @@ where block: &BlockWithSenders, total_difficulty: U256, ) -> Result { + println!("execute_without_verification"); + // 1. prepare state on new block self.on_new_block(&block.header); diff --git a/crates/ethereum/node/src/launch.rs b/crates/ethereum/node/src/launch.rs index db310d179ddf..aad203358c23 100644 --- a/crates/ethereum/node/src/launch.rs +++ b/crates/ethereum/node/src/launch.rs @@ -63,6 +63,8 @@ where self, target: NodeBuilderWithComponents, ) -> eyre::Result { + println!("Brecht: EthNodeLauncher launch_node"); + let Self { ctx } = self; let NodeBuilderWithComponents { adapter: NodeTypesAdapter { database }, diff --git a/crates/ethereum/node/src/node.rs b/crates/ethereum/node/src/node.rs index 264297bc406a..0db2a8cb2f61 100644 --- a/crates/ethereum/node/src/node.rs +++ b/crates/ethereum/node/src/node.rs @@ -53,6 +53,7 @@ impl EthereumNode { PayloadBuilderAttributes = EthPayloadBuilderAttributes, >, { + println!("EthereumNode.components"); ComponentsBuilder::default() .node_types::() .pool(EthereumPoolBuilder::default()) diff --git a/crates/ethereum/node/tests/e2e/eth.rs b/crates/ethereum/node/tests/e2e/eth.rs index 8e6938b47fe4..df39890e64a3 100644 --- a/crates/ethereum/node/tests/e2e/eth.rs +++ b/crates/ethereum/node/tests/e2e/eth.rs @@ -45,6 +45,8 @@ async fn can_run_eth_node() -> eyre::Result<()> { // assert the block has been committed to the blockchain node.assert_new_block(tx_hash, block_hash, block_number).await?; + println!("Ran node"); + Ok(()) } diff --git a/crates/ethereum/payload/src/lib.rs b/crates/ethereum/payload/src/lib.rs index e853cb1ad12c..2d95f90fdbcb 100644 --- a/crates/ethereum/payload/src/lib.rs +++ b/crates/ethereum/payload/src/lib.rs @@ -261,6 +261,8 @@ where Client: StateProviderFactory, Pool: TransactionPool, { + // Brecht: ethereum payload builder + let BuildArguments { client, pool, mut cached_reads, config, cancel, best_payload } = args; let state_provider = client.state_by_block_hash(config.parent_block.hash())?; diff --git a/crates/exex/exex/src/backfill/job.rs b/crates/exex/exex/src/backfill/job.rs index 64bb3a26423a..5fdebb83f06b 100644 --- a/crates/exex/exex/src/backfill/job.rs +++ b/crates/exex/exex/src/backfill/job.rs @@ -184,6 +184,8 @@ where &self, block_number: u64, ) -> Result<(BlockWithSenders, BlockExecutionOutput), BlockExecutionError> { + println!("SingleBlockBackfillJob::execute_block"); + let td = self .provider .header_td_by_number(block_number)? diff --git a/crates/exex/exex/src/backfill/test_utils.rs b/crates/exex/exex/src/backfill/test_utils.rs index 05b41cd2b998..a50bd71ae354 100644 --- a/crates/exex/exex/src/backfill/test_utils.rs +++ b/crates/exex/exex/src/backfill/test_utils.rs @@ -46,6 +46,7 @@ pub(crate) fn chain_spec(address: Address) -> Arc { ) } +// Brecht execute_block_and_commit_to_database pub(crate) fn execute_block_and_commit_to_database( provider_factory: &ProviderFactory, chain_spec: Arc, @@ -54,6 +55,7 @@ pub(crate) fn execute_block_and_commit_to_database( where DB: reth_db_api::database::Database, { + println!("execute_block_and_commit_to_database"); let provider = provider_factory.provider()?; // Execute the block to produce a block execution output diff --git a/crates/exex/test-utils/src/lib.rs b/crates/exex/test-utils/src/lib.rs index aea6ff7ff641..522ddb662e83 100644 --- a/crates/exex/test-utils/src/lib.rs +++ b/crates/exex/test-utils/src/lib.rs @@ -128,6 +128,7 @@ where type AddOns = EthereumAddOns; fn components_builder(&self) -> Self::ComponentsBuilder { + println!("components_builder"); ComponentsBuilder::default() .node_types::() .pool(TestPoolBuilder::default()) diff --git a/crates/node/builder/src/launch/common.rs b/crates/node/builder/src/launch/common.rs index a2b2818616cb..527724c9e680 100644 --- a/crates/node/builder/src/launch/common.rs +++ b/crates/node/builder/src/launch/common.rs @@ -144,7 +144,7 @@ impl LaunchContext { if let Err(err) = ThreadPoolBuilder::new() .num_threads(num_threads) .thread_name(|i| format!("reth-rayon-{i}")) - .build_global() + .build() { error!(%err, "Failed to build global thread pool") } @@ -360,6 +360,7 @@ where /// between the database and static files. **It may execute a pipeline unwind if it fails this /// check.** pub async fn create_provider_factory(&self) -> eyre::Result> { + println!("Brecht: create_provider_factory"); let factory = ProviderFactory::new( self.right().clone(), self.chain_spec(), diff --git a/crates/node/builder/src/launch/mod.rs b/crates/node/builder/src/launch/mod.rs index c18381a2de92..c2ccad863d07 100644 --- a/crates/node/builder/src/launch/mod.rs +++ b/crates/node/builder/src/launch/mod.rs @@ -106,10 +106,13 @@ where { type Node = NodeHandle, AO>; + // Brecht async fn launch_node( self, target: NodeBuilderWithComponents, ) -> eyre::Result { + println!("Brecht: DefaultNodeLauncher launch_node"); + let Self { ctx } = self; let NodeBuilderWithComponents { adapter: NodeTypesAdapter { database }, diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index 221b07507d50..887f741d62a6 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -237,6 +237,7 @@ where Client: StateProviderFactory, Pool: TransactionPool, { + // Brecht: optimism payload builder let BuildArguments { client, pool, mut cached_reads, config, cancel, best_payload } = args; let state_provider = client.state_by_block_hash(config.parent_block.hash())?; diff --git a/crates/revm/src/database.rs b/crates/revm/src/database.rs index 5edd76bea4da..8ea463fdc93e 100644 --- a/crates/revm/src/database.rs +++ b/crates/revm/src/database.rs @@ -68,7 +68,8 @@ pub struct StateProviderDatabase(pub DB); impl StateProviderDatabase { /// Create new State with generic `StateProvider`. - pub const fn new(db: DB) -> Self { + pub fn new(db: DB) -> Self { + println!("Brecht: StateProviderDatabase::new"); Self(db) } @@ -100,6 +101,7 @@ impl Database for StateProviderDatabase { /// Returns `Ok` with `Some(AccountInfo)` if the account exists, /// `None` if it doesn't, or an error if encountered. fn basic(&mut self, address: Address) -> Result, Self::Error> { + println!("Brecht: read account"); DatabaseRef::basic_ref(self, address) } diff --git a/crates/storage/db/src/implementation/mdbx/mod.rs b/crates/storage/db/src/implementation/mdbx/mod.rs index cc9f055e9533..f7fa071397c5 100644 --- a/crates/storage/db/src/implementation/mdbx/mod.rs +++ b/crates/storage/db/src/implementation/mdbx/mod.rs @@ -419,6 +419,7 @@ impl DatabaseEnv { /// Creates all the defined tables, if necessary. pub fn create_tables(&self) -> Result<(), DatabaseError> { + println!("create_tables"); let tx = self.inner.begin_rw_txn().map_err(|e| DatabaseError::InitTx(e.into()))?; for table in Tables::ALL { diff --git a/crates/storage/db/src/mdbx.rs b/crates/storage/db/src/mdbx.rs index d6947e10bd2b..ae34eb9eea67 100644 --- a/crates/storage/db/src/mdbx.rs +++ b/crates/storage/db/src/mdbx.rs @@ -10,6 +10,7 @@ pub use reth_libmdbx::*; /// Creates a new database at the specified path if it doesn't exist. Does NOT create tables. Check /// [`init_db`]. pub fn create_db>(path: P, args: DatabaseArguments) -> eyre::Result { + println!("create_db"); use crate::version::{check_db_version_file, create_db_version_file, DatabaseVersionError}; let rpath = path.as_ref(); @@ -31,7 +32,8 @@ pub fn create_db>(path: P, args: DatabaseArguments) -> eyre::Resu /// Opens up an existing database or creates a new one at the specified path. Creates tables if /// necessary. Read/Write mode. pub fn init_db>(path: P, args: DatabaseArguments) -> eyre::Result { - let client_version = args.client_version().clone(); + println!("init_db"); + let client_version: reth_db_api::models::ClientVersion = args.client_version().clone(); let db = create_db(path, args)?; db.create_tables()?; db.record_client_version(client_version)?; diff --git a/crates/storage/provider/src/providers/database/mod.rs b/crates/storage/provider/src/providers/database/mod.rs index 05c332508f12..a9df016a8add 100644 --- a/crates/storage/provider/src/providers/database/mod.rs +++ b/crates/storage/provider/src/providers/database/mod.rs @@ -93,6 +93,7 @@ impl ProviderFactory { args: DatabaseArguments, static_file_provider: StaticFileProvider, ) -> RethResult { + println!("new_with_database_path"); Ok(Self { db: Arc::new(init_db(path, args).map_err(RethError::msg)?), chain_spec, diff --git a/packages/protocol/contracts/L1/TaikoEvents.sol b/packages/protocol/contracts/L1/TaikoEvents.sol index 06f77c1cad5f..104124576102 100644 --- a/packages/protocol/contracts/L1/TaikoEvents.sol +++ b/packages/protocol/contracts/L1/TaikoEvents.sol @@ -19,7 +19,7 @@ abstract contract TaikoEvents { /// @param blockId The ID of the proposed block. /// @param meta The block metadata containing information about the proposed /// block. - event BlockProposed(uint256 indexed blockId, TaikoData.BlockMetadata meta); + event BlockProposed(uint256 indexed blockId, TaikoData.BlockMetadata meta, bytes txList); /// @dev Emitted when a block is verified. /// @param blockId The ID of the verified block. /// @param blockHash The hash of the verified block. diff --git a/packages/protocol/contracts/L1/TaikoL1.sol b/packages/protocol/contracts/L1/TaikoL1.sol index 75981bce97fe..4a27a6ba2513 100644 --- a/packages/protocol/contracts/L1/TaikoL1.sol +++ b/packages/protocol/contracts/L1/TaikoL1.sol @@ -164,7 +164,7 @@ contract TaikoL1 is EssentialContract, TaikoEvents, TaikoErrors { // revert L1_INVALID_TIMESTAMP(); // } - emit BlockProposed({ blockId: _block.l2BlockNumber, meta: _block }); + emit BlockProposed({ blockId: _block.l2BlockNumber, meta: _block, txList: txList }); } // These will be unknown in the smart contract diff --git a/packages/protocol/deployments/deploy_l1.json b/packages/protocol/deployments/deploy_l1.json index 7e611cc41815..7741733c17e2 100644 --- a/packages/protocol/deployments/deploy_l1.json +++ b/packages/protocol/deployments/deploy_l1.json @@ -1,5 +1,11 @@ { - "address_manager": "0x2946259E0334f33A064106302415aD3391BeD384", - "bridge": "0x6D411e0A54382eD43F02410Ce1c7a7c122afA6E1", - "signal_service": "0x66a15edcC3b50a663e72F1457FFd49b9AE284dDc" + "chain_prover": "0x373E0B8B80A15cdf587C1263654c6B5edd195a43", + "rollup_address_manager": "0x8F0342A7060e76dfc7F6e9dEbfAD9b9eC919952c", + "shared_address_manager": "0x17435ccE3d1B4fA2e5f8A08eD921D57C6762A180", + "taiko": "0x9fCF7D13d10dEdF17d0f24C62f0cf4ED462f65b7", + "taiko_token": "0x422A3492e218383753D8006C7Bfa97815B44373F", + "tier_sgx1": "0x1ADB9959EB142bE128E6dfEcc8D571f07cd66DeE", + "tier_sgx2": "0x3A8C1bd531b5C1aeFBB9ebc3e021C1251cF4Ccb1", + "tier_sgx3": "0x80741a37E3644612F0465145C9709a90B6D77Ee3", + "verifier_registry": "0x9ECB6f04D47FA2599449AaA523bF84476f7aD80f" } \ No newline at end of file diff --git a/packages/protocol/scripts/setup_deps.sh b/packages/protocol/scripts/setup_deps.sh index c22b6f79a510..648fb3ca52d4 100755 --- a/packages/protocol/scripts/setup_deps.sh +++ b/packages/protocol/scripts/setup_deps.sh @@ -57,13 +57,13 @@ if [[ "$OSTYPE" == "darwin"* ]]; then elif [[ "$OSTYPE" == "linux-gnu"* ]]; then if [ -f /etc/os-release ]; then . /etc/os-release - if [[ "$ID" == "ubuntu" ]]; then + #if [[ "$ID" == "ubuntu" ]]; then echo "Detected Ubuntu." install_kurtosis_ubuntu - else - echo "This script currently supports only Ubuntu and macOS." - exit 1 - fi + #else + # echo "This script currently supports only Ubuntu and macOS." + # exit 1 + #fi else echo "This script currently supports only Ubuntu and macOS." exit 1